最近做個一個項目需要用到setup.py 這個構建工具來進行項目的便捷安裝,把搜集到的一些資料加上個人理解整理成文章,如有錯誤的地方請各位大佬及時指出,小弟馬上修改,下面正式進入setup.py的描述講解.
1.因為我們要用setup.py來將我們的項目打包成一個Python包,所以首先我們需要創建一個包文件夾,該包的命名依照以下包版本的命名格式:
N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN]
解釋:
"N.N": 必須的部分,兩個"N" 分別代表了主板本和副版本號.
"[.N]": 次要版本號,可以有零或多個.
"{a|b|c|rc}": 階段代號,可選, a,b,c,rc 分別代表alpha, beta, candidate 和 release candidate.
"N[.N]": 階段版本號,如果提供, 則至少有一位主版本號, 后面可以加無限多位的副版本號.
".postN": 發行后更新版本號, 可選.
".devN": 開發期間的發行版本號, 可選.
注意: 上面涉及到的命名中的英文字母盡量全是小寫(我測試的時候是全用的小寫沒有出現什么問題,這個根據具體情況定吧).
2.包的版本號確定之后,需要弄清楚包里面應該包含那些文件, 一個標准的包里面應該包含CHANGES.rst , LICENSE , MANIFEST.in , README.rst , setup.py , setup.cfg , src(含有__init__.py 文件的文件夾), 可能有的文章還會介紹有別的文件,但是有這些文件基本上不會出現什么問題.
3.介紹完包中的文件之后,我們來看一下每個文件具體的作用.
MANIFEST.in : 里面就是需要包含在分發包中的文件,也就是需要把要查找的分發的包的路徑寫上,例如:

1 include MANIFEST.in 2 recursive-include src/*
setup.cfg : 文件主要用於提供setup.py 的默認參數, 我用到的是填上了pip 鏡像源的地址,如果有其他的需要,可以參考https://docs.python.org/3/distutils/configfile.html

[easy_install]
Index_url = http://pypi.douban.com/simple
src : 該文件夾里面含有__init__.py 文件, 還應該含有需要打包的源代碼, 主要用於setup.py 文件中的packages: find_packages() 這個參數.
setup.py : 主要寫需要安裝的包的一些配置信息, 這里主要介紹一下里面常用到的一些基本的參數:
name : 包的名稱, 以后查找的時候需要根據此名稱查詢.
version : 包的版本號.
license : 程序的授權許可信息.
description : 程序的簡單描述.
long_description : 程序的詳細描述.
auther : 程序的作者.
auther_email : 程序作者的郵箱.
packages : 需要處理的包目錄 (包含__init__.py 文件的文件夾), 一般可以采用find_packages() 這個函數, 它會默認在和setup.py 同一目錄下搜索各個含有__init__.py 的包,也可以排除一些特定的包, find_packages(exclude=[" *.text", ....]).
install_requires : 需要安裝的依賴包, 這個的值應該是一個list列表.
download_url : 程序的下載地址.
package_data : 指定包內需要包含的數據文件.
data_files : 打包時需要打包的數據文件, 如圖片, 配置文件等.
setup_requires : 指定運行setup.py 這個文件本身所依賴的包.
include_package_data : 該參數設置為True 時, 自動添加包中受版本控制的數據文件.( 這個我也沒有太搞懂, 不過一般都會設置成True, 有大神明白的可以教教我,感謝! )
zip_safe : 該參數決定了包是否作為一個zip壓縮后的egg 文件安裝,還是作為一個以 .egg 結尾的目錄安裝. 因為有些工具不支持zip壓縮文件, 而且壓縮后的包也不方便調試, 所以建議將其設置為False.
entry_points : 發現動態服務和插件, 在entry_points 中, console_scripts 指明了命令行工具的名稱, 如下面的代碼示例一樣, 等號前面指明了工具包的名稱, 等號后面的內容指明了程序的入口地址, 這里可以有多條記錄, 這樣一個項目就可以制作多個命令行工具了.當我們想要啟動對應的程序時, 只需要輸入等號前面的工具包的名稱即可.

1 setup( 2 # ..... 3 entry_points={ 4 "console_scripts": [ 5 "service_name=service.main", 6 ..................... 7 ] 8 } 9 10 )
4.以上的我整理的內容就可以完成一般常規項目的setup.py 文件的制作了,如果需要添加具體別的功能參數可以參考以下網站:
http://blog.konghy.cn/2018/04/29/setup-dot-py/
https://docs.python.org/3/distutils/setupscript.html