轉載一個操作的例子: https://www.cnblogs.com/anliven/p/9840583.html
太多了,直接官網看介紹吧
下載和官網: https://pypi.org/project/setuptools/
文檔:https://setuptools.readthedocs.io/en/latest/
另外一個沒使用: https://pypi.org/project/setuptools-scm/
Setuptools
是Python的增強功能集合distutils
,允許開發人員更輕松地構建和分發Python包,尤其是那些依賴於其他包的包。
使用setuptools
基於的普通Python包對用戶進行構建和分發的包distutils
。您的用戶無需安裝甚至不需要了解setuptools即可使用它們,並且您不必在發行版中包含整個setuptools包。通過僅包含一個引導程序模塊(12K .py文件),setuptools
如果用戶從源代碼構建程序包並且尚未安裝合適的版本,則程序包將自動下載並安裝。
特色亮點:
- 使用EasyInstall工具在構建時自動查找/下載/安裝/升級依賴項,該工具支持通過HTTP,FTP,Subversion和SourceForge進行下載,並自動掃描從PyPI鏈接的網頁以查找下載鏈接。(這是目前最適合Python的CPAN。)
- 創建Python Eggs - 單文件可導入的分發格式
- 增強了對訪問壓縮包中托管的數據文件的支持。
- 自動包含源樹中的所有包,而不在setup.py中單獨列出它們
- 自動包含源分發中的所有相關文件,無需創建
MANIFEST.in
文件,也無需MANIFEST
在源樹更改時強制重新生成文件。 - 自動為項目中的任意數量的“主要”功能生成包裝器腳本或Windows(控制台和GUI).exe文件。(注意:這不是py2exe替換; .exe文件依賴於本地Python安裝。)
- 透明的Cython支持,這樣你的setup.py可以列出
.pyx
文件,即使最終用戶沒有安裝Cython也可以工作(只要你在源代碼發行版中包含Cython生成的C) - 命令別名 - 為常用命令和選項創建項目特定,每用戶或站點范圍的快捷方式名稱
- 以“開發模式”部署項目,使其可用
sys.path
,但仍可直接從其源檢出中進行編輯。 - 使用新命令或
setup()
參數輕松擴展distutils ,並為多個項目分發/重用擴展,而無需復制代碼。 - 使用項目設置腳本中聲明的簡單“入口點”,創建可自動發現擴展的可擴展應用程序和框架。
- 完全支持PEP 420 via
find_namespace_packages()
,它也向后兼容find_packages()
Python> = 3.3 的現有版本。
基本用法
對於setuptools的基本使用,只需從setuptools而不是distutils導入東西。這是使用setuptools的最小設置腳本:
-
from setuptools import setup, find_packages
-
setup(
-
name="HelloWorld",
-
version="0.1",
-
packages=find_packages(),
-
)
調用該腳本以生成分發,並自動包含setup.py所在目錄中的所有包。請參閱下面的“ 命令參考”部分,了解可以為此安裝腳本提供的命令。例如,要生成源代碼分發,只需調用:
python setup.py sdist
新的和更改的setup()
關鍵字
要setup()
添加或更改 以下關鍵字參數setuptools
。所有這些都是可選的; 除非您需要相關setuptools
功能,否則不必提供它們。
include_package_data
如果設置為True
,則告訴setuptools
它自動包含它在您的MANIFEST.in
文件指定的包目錄中找到的任何數據文件。有關更多信息,請參閱下面有關包含數據文件的部分 。
exclude_package_data
將包名稱映射到應從包目錄中排除的glob模式列表的字典。您可以使用它來修剪包含的任何多余文件include_package_data
。有關完整說明和示例,請參閱下面有關包含數據文件的部分。
package_data
將包名稱映射到glob模式列表的字典。有關完整說明和示例,請參閱下面有關包含數據文件的部分。如果您正在使用include_package_data
,則不需要使用此選項 ,除非您需要添加由安裝腳本和構建過程生成的文件。(因此不在源代碼管理中,或者是您不希望包含在源代碼分發中的文件。)
zip_safe
一個布爾(True或False)標志,指定項目是否可以安全地安裝並從zip文件運行。如果未提供此參數,則bdist_egg
每次構建一個egg時,該命令都必須分析所有項目的內容以查找可能的問題。
install_requires
一個字符串或字符串列表,指定在此時需要安裝的其他發行版。有關此參數格式的詳細信息和示例,請參閱下面有關聲明依賴關系的部分。
entry_points
將入口點組名稱映射到字符串或定義入口點的字符串列表的字典。入口點用於支持項目提供的服務或插件的動態發現。有關此參數格式的詳細信息和示例,請參閱服務和插件的動態發現。此外,此關鍵字用於支持自動腳本創建。
extras_require
將“extras”(項目的可選功能)的名稱映射到字符串或字符串列表的字典,指定必須安裝哪些其他發行版才能支持這些功能。有關此參數格式的詳細信息和示例,請參閱下面有關聲明依賴關系的部分。
python_requires
對應於Python版本的版本說明符(如PEP 440中所定義)的字符串,用於指定PEP 345中定義的Requires-Python。
setup_requires
字符串或字符串列表,指定需要存在的其他分發以便運行安裝腳本。 在處理其余的安裝腳本或命令之前,setuptools
將嘗試獲取這些(甚至可以下載它們 EasyInstall
)。如果您在構建過程中使用distutils擴展,則需要此參數; 例如,處理setup()參數並將它們轉換為EGG-INFO元數據文件的擴展。
(注意:列出的項目setup_requires
不會自動安裝在運行安裝腳本的系統上。如果它們本地不可用,則只需將它們下載到./.egs目錄。如果要安裝它們,以及在運行安裝腳本時可用,您應該將它們添加到install_requires
和 setup_requires
。)
dependency_links
在滿足依賴關系時命名要搜索的URL的字符串列表。如果需要安裝由setup_requires
或指定的包,將使用這些鏈接tests_require
。它們也將被寫入egg的元數據,供EasyInstall等工具在安裝.egg
文件時使用。
namespace_packages
命名項目“命名空間包”的字符串列表。命名空間包是可以跨多個項目分發拆分的包。例如,Zope 3的zope
包是一個名稱空間包,因為子包類似zope.interface
並且zope.publisher
可以單獨分發。雞蛋運行時系統可以這樣子包自動合並成在運行一個父包,只要您在包含命名空間封裝的任何子包每個項目申報他們,只要命名空間封裝的__init__.py
不包含比其他任何代碼名稱空間聲明 有關更多信息,請參閱下面有關命名空間包的部分。
test_suite
一個字符串,用於命名unittest.TestCase
子類(或包含其中一個或多個的包或模塊,或此類子類的方法),或命名一個可以不帶參數調用的函數並返回一個 unittest.TestSuite
。如果命名套件是一個模塊,並且模塊有一個additional_tests()
函數,則調用它並將結果添加到要運行的測試中。如果命名套件是一個包,則任何子模塊和子包都以遞歸方式添加到整個測試套件中。
指定此參數可以使用test命令運行指定的測試套件,例如通過。有關詳細信息,請參閱下面的測試命令部分 。setup.py test
tests_require
如果項目的測試需要一個或多個附加軟件包,除了安裝它們之外,還可以使用此選項來指定它們。它應該是一個字符串或字符串列表,指定要運行的包測試需要提供的其他發行版。當您運行該test
命令時,setuptools
將嘗試獲取這些命令(甚至可以使用它來下載它們EasyInstall
)。請注意,這些必需的項目不會安裝在運行測試的系統上,但只有在本地尚未安裝的情況下才會下載到項目的安裝目錄中。
test_loader
如果您想使用與setuptools通常使用的不同的查找運行方式,可以在此參數中指定模塊名稱和類名稱。命名類必須是可實例化的,不帶參數,並且其實例必須支持loadTestsFromNames()
Python unittest
模塊TestLoader
類中定義的方法。Setuptools只會在names參數中傳遞一個測試“name” :為參數提供的值test_suite
。您指定的加載器可以以任何方式解釋此字符串,因為對test_suite
字符串中可能包含的內容沒有限制。
模塊名稱和類名必須用a分隔:
。該參數的默認值為"setuptools.command.test:ScanningLoader"
。如果要使用默認unittest
行為,則可以指定 "unittest:TestLoader"
為test_loader
參數。這將阻止子模塊和子包的自動掃描。
您在此處指定的模塊和類可能包含在另一個包中,只要您使用該tests_require
選項以確保在test
運行該命令時包含加載程序類的包可用。
eager_resources
應該一起提取的命名資源的字符串列表,如果需要它們中的任何一個,或者是否導入了項目中包含的任何C擴展。僅當項目將作為zip文件安裝時,此參數才有用,並且需要將所有列出的資源作為一個單元提取到文件系統。此處列出的資源應為'/' - 相對於源根的分隔路徑,因此要foo.png
在包中列出資源bar.baz
,您應bar/baz/foo.png
在此參數中包含該字符串 。
如果您只需要一次獲取一個資源,或者您沒有任何C擴展來訪問項目中的其他文件(例如數據文件或共享庫),您可能不需要這個參數而且不應該弄亂用它。有關此參數如何工作的更多詳細信息,請參閱下面有關自動資源提取的部分。
use_2to3
在構建過程中,使用2to3將源代碼從Python 2轉換為Python 3。有關更多詳細信息,請參閱使用Setuptools支持Python 2和Python 3。
convert_2to3_doctests
需要使用2to3轉換的doctest源文件列表。有關更多詳細信息,請參閱使用Setuptools支持Python 2和Python 3。
use_2to3_fixers
用於搜索在2to3轉換期間使用的其他修復程序的模塊列表。有關更多詳細信息,請參閱使用Setuptools支持Python 2和Python 3。
project_urls
URL名稱到超鏈接的任意映射,允許更多可擴展的文檔記錄可以找到的各種資源,而不是簡單 url
和download_url
選項。
對於簡單的項目,通常很容易手動將包添加到packages
參數中setup()
。但是,對於非常大的項目(Twisted,PEAK,Zope,Chandler等),保持包列表更新可能是一個很大的負擔。這setuptools.find_packages()
是為了什么。
find_packages()
獲取源目錄和兩個包名稱模式列表以排除和包含。如果省略,源目錄默認為與安裝腳本相同的目錄。有些項目使用src
或lib
目錄作為源樹的根,這些項目當然會使用"src"
或"lib"
作為第一個參數find_packages()
。(而且這些項目也需要類似於package_dir={'':'src'}
他們的 setup()
論點,但這只是一個正常的事情。)
無論如何,find_packages()
遍歷目標目錄,按包含模式過濾,並找到Python包(任何目錄)。只有包含__init__.py
文件時才會識別包。最后,應用排除模式來刪除匹配的包。
包含和排除模式是包名稱,可選地包括通配符。例如,find_packages(exclude=["*.tests"])
將排除其姓氏為的所有包tests
。或者,也將排除所有已命名的軟件包子包,但它仍然不會排除頂級軟件包或其子代。事實上,如果你真的不想要任何包,你需要這樣的東西:find_packages(exclude=["*.tests", "*.tests.*"])
tests
tests
tests
find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"])