如何打包和發佈Python程序

原文首發

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

附錄

新書推薦

Python Web自動化測試設計與實現

獲取更多關於Python和自動化測試的文章,請掃描如下二維碼!
關注二維碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章