如何打包和發佈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服務了!
PYPI發佈
同樣的你需要在PYPI的官網https://pypi.org/account/register/註冊一個賬號。然後執行一個上傳操作:
twine upload dist/*
# entry your username and password
上傳完成之後通過如下命令可直接安裝:
pip install PyTestReport
同樣的,你也可以通過https://pypi.org/manage/projects/來查看和管理已上傳的項目。
附錄
- https://packaging.python.org/tutorials/packaging-projects/
- http://blog.konghy.cn/2018/04/29/setup-dot-py/
- http://www.cnblogs.com/UnGeek/p/5922630.html
新書推薦
獲取更多關於Python和自動化測試的文章,請掃描如下二維碼!