如何打包和發布Python程式
- 2019 年 10 月 4 日
- 筆記
如何打包和發布Python程式
在使用Python的過程中,我們經常需要做的一件事情就是通過pip來安裝第三方的包。那麼你是否也曾想過pip安裝的包是怎麼被打包並發布上去的呢?今天就來說一說Python的第三方包的打包與發布流程!
打包
想要發布一個第三方的包,首先你得有一個需要發布的項目。這個項目可以完成任何有意義的事情。比如:今天的樣例就是一個Python的測試報告第三方庫。
當我們把功能模組已經實現好之後,就可以按照python打包的目錄結構要求來搭建了。具體步驟為:
- 新建一個目錄作為根目錄
- 把功能模組以Python包的形式放入根目錄
- 在根目錄中創建setup.py文件,並填寫相應內容
- 在根目錄創建其它描述文件,如:LISENCE,README等
這裡以PyTestReport項目為例,介紹Python打包的目錄結構,當然還可以有其它形式的目錄結構。
PyTestReport |-- pytestreport |-- __init__.py |-- HTMLTestRunner.py |-- templates |-- default.html |-- static |-- css |-- default.css |-- js |-- default.js |-- test |-- LICENSE |-- README.md |-- setup.py
上面的目錄結構就是一個典型的Python打包目錄結構。其中最重要的是setup.py文件,而這個項目的功能模組就是pytestreport這個包。接下來最重要的就是如何編寫setup.py文件。
編寫setup.py文件
直接上PyTestReport的參考樣例,然後我們再看看幾個重要的欄位就基本可以了!
#!/usr/bin/env python # coding=utf-8 from setuptools import setup, find_packages setup( name="PyTestReport", version="0.1.1", keywords=("test report", "python unit testing"), description="The HTML Report for Python unit testing Base on HTMLTestRunner", long_description="The HTML Report for Python unit testing Base on HTMLTestRunner", license="MIT", url="https://github.com/five3/PyTestReport", author="Xiaowu Chen", author_email="[email protected]", package_dir={'pytestreport': 'pytestreport'}, # 指定哪些包的文件被映射到哪個源碼包 packages=['pytestreport'], # 需要打包的目錄。如果多個的話,可以使用find_packages()自動發現 include_package_data=True, py_modules=[], # 需要打包的python文件列表 data_files=['pytestreport/templates/default.html', 'pytestreport/static/css/default.css', 'pytestreport/static/js/default.js'], # 打包時需要打包的數據文件 platforms="any", install_requires=[ # 需要安裝的依賴包 'Flask>=1.0.2' ], scripts=[], # 安裝時複製到PATH路徑的腳本文件 entry_points={ 'console_scripts': [ # 配置生成命令行工具及入口 'PyTestReport.shell = pytestreport:shell', 'PyTestReport.web = pytestreport:web' ] }, classifiers=[ # 程式的所屬分類列表 "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], zip_safe=False )
這個文件的上半部分欄位可以自行查閱即可。這裡有幾個可能入坑的欄位來看一下。更多詳情可參考附錄部分!
- packages:需要打包的Python包目錄;注意如果有子包則必須顯式的列出來,如:pytestreport.api
- data_files:需要打包的非.py文件;
- entry_points:指定安裝包之後的程式入口腳本;比如:pip命令就是通過這種方式創建的
編譯
項目目錄結構和setup.py文件都就緒之後,就可以開始編譯並打包了;首先最好升級下打包相關的基礎庫。
python -m pip install --upgrade pip pip install --upgrade setuptools wheel
接著,從命令行進入項目的根目錄,通過如下命令即可進行編譯打包操作:
python setup.py sdist # 打源碼包 python setup.py bdist # 打二進位包 python setup.py bdist_egg # 打egg包 python setup.py bdist_wheel # 打wheel包
執行完命令之後,會在項目的根目錄創建一個dist目錄,所有打包的文件都存放在此目錄下。
在打包後,可以本地進行安裝和使用測試,當然你也可以通過如下命令直接安裝:
python setup.py build python setup.py install
發布
當我們的項目打包並測試完成之後,就可以開始發布之旅了!首先你得需要安裝另一個基礎庫。
pip install twine
此外,你還需要在PYPI的官網上進行帳號的註冊!當然官方會建議你先在一個叫TestPYPI的測試鏡像服務上先進行預發布。當在TestPYPI服務上發布成功並進行完安裝和使用測試之後,再把項目包發布到PYPI服務上。
TestPYPI發布
首先在https://test.pypi.org/account/register/註冊一個賬戶。然後在項目根目錄執行如下命令:
twine upload --repository-url https://test.pypi.org/legacy/ dist/* # entry your username and password
過程中會需要你輸入註冊的帳號資訊,等上傳完成之後可以通過如下的方式來進行包的安裝。
pip install --index-url https://test.pypi.org/simple/ PyTestReport
你也可以直接通過https://test.pypi.org/manage/projects/來查看你已經上傳的項目,並通過點擊[View]來查看項目的具體資訊。

PYPI Projects
安裝完成之後,則需要測試下安裝包是否能正常的工作,指定的入口腳本是否安裝並正常使用,如果一切正常那麼恭喜你了發布到正式的PYPI服務了!
PYPI發布
同樣的你需要在PYPI的官網https://pypi.org/account/register/註冊一個帳號。然後執行一個上傳操作:
twine upload dist/* # entry your username and password
上傳完成之後通過如下命令可直接安裝:
pip install PyTestReport
同樣的,你也可以通過https://pypi.org/manage/projects/來查看和管理已上傳的項目。

PYPI Projects