如何打包和發布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