Python將自己寫的模塊進行打包


將項目打包成模塊的想法來自於flask文檔教程,這不是在PyCon上和阿明合了照嘛,這不得多看看人家的東西。有興趣的可以看看文檔的項目可安裝化部分,作者將flask項目打包成一個包,使其可以再任何地方導入項目並允許,也可以通過pip install youproject.whl的方式來安裝項目並安裝相關的依賴。
可以先瞄一眼官方的打包指南:跳轉

1.setuptools簡介

setuptoolsdistutils(自行百度)增強版。其擴展了很多功能,能夠幫助開發者更好的創建和分發 Python 包。大部分 Python 用戶都會使用更先進的 setuptools 模塊。

2.包格式

Python 庫打包的格式包括 Wheel 和 Egg。Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定義。使用 Wheel 和 Egg 安裝都不需要重新構建和編譯,其在發布之前就應該完成測試和構建。現在普遍用Wheel的比較多

3.setup.py文件

from setuptools import find_packages, setup

setup(
    name='flaskr',
    version='1.0.0',
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
    install_requires=[
        'flask',
    ],
)
相關參數可以[查看](https://setuptools.readthedocs.io/en/latest/setuptools.html#metadata)

常用參數解釋:

參數名 解釋
name 包名稱
version 包版本
author 程序的作者
author_email 程序的作者的郵箱地址
maintainer 維護者
maintainer_email 維護者的郵箱地址
url 程序的官網地址
license 程序的授權信息
description 程序的簡單描述
long_description 程序的詳細描述
platforms 程序適用的軟件平台列表
classifiers 程序的所屬分類列表
keywords 程序的關鍵字列表
packages 需要處理的包目錄(通常為包含 init.py 的文件夾)
py_modules 需要打包的 Python 單文件列表
download_url 程序的下載地址
cmdclass 添加自定義命令
package_data 指定包內需要包含的數據文件
include_package_data 自動包含包內所有受版本控制(cvs/svn/git)的數據文件
exclude_package_data 當 include_package_data 為 True 時該選項用於排除部分文件
data_files 打包時需要打包的數據文件,如圖片,配置文件等
ext_modules 指定擴展模塊
scripts 指定可執行腳本,安裝時腳本會被安裝到系統 PATH 路徑下
package_dir 指定哪些目錄下的文件被映射到哪個源碼包
requires 指定依賴的其他包
provides 指定可以為哪些模塊提供依賴
install_requires 安裝時需要安裝的依賴包
entry_points 動態發現服務和插件,下面詳細講
setup_requires 指定運行 setup.py 文件本身所依賴的包
dependency_links 指定依賴包的下載地址
extras_require 當前包的高級/額外特性需要依賴的分發包
zip_safe 不壓縮包,而是以目錄的形式安裝

3.1. find_packages(where='',exclude=(),include=('*',))

上面的setup.py中使用的find_packages(),可以方便的為我們添加包不需要手動添加。默認搜索與setup.py同級目錄下各個含有__init__.py的目錄作為要添加的包。

函數的第一個參數用於指定哪個目錄下搜索包,參數exclude用於指定排除哪些包,include指定要包含的包。

3.2. include_package_data:

設置為True,自動添加包中受版本控制的數據文件,當需要添加沒有被版本控制的文件時,需使用package_data

3.3manifest.in文件(與setup.py同級目錄)

文件內容就是需要保護在分發包中的文件

include flaskr/schema.sql
graft flaskr/static
graft flaskr/templates
global-exclude *.pyc

復制所有 statictemplates 文件夾中的文件,schema.sql文件,但是排除所有字節文件。

3.4. zip_safe

zip_safe 參數決定包是否作為一個zip壓縮后的 egg 文件安裝,還是作為一個以 .egg 結尾的目錄安裝。因為有些工具不支持 zip 壓縮文件,而且壓縮后的包也不方便調試,所以建議將其設為 False,即 zip_safe=False

3.5. install_requires

如果你的包依賴於其他包,可以指定install_requires參數,為一個列表

install_requires=[
    'requests>=1.0',
    'flask>=1.0'
]

默認從pypi下載安裝指定依賴包,也可以指定鏈接下載依賴

dependency_links = [
    "http://packages.example.com/snapshots/foo-1.0.tar.gz",
    "http://example2.com/p/bar-1.0.tar.gz",
]

4.本地測試安裝

pip3 install -e .

在當前文件夾中尋找setup.py並在開發模式下安裝,安裝好后通過pip list即可查看本地安裝的情況。換個文件夾開始導入你的包進行測試,是否可以正常使用。

5.構建發行文件

先安裝好wheel
pip3 install wheel

安裝好后,執行bdist_wheel構建發行文件

python3 setup.py bdist_wheel

會生成dist目錄,下面有一個flaskr-1.0.0-py3-none-any.whl類似的由項目名稱、版本號和項目安裝要求的標記組成。復制該文件到別的計算機,通過pip命令安裝該文件。

6.發布包(簡略)

如果要將包發布到PyPI(Python Package Index)官方維護的第三方包倉庫,需要先注冊pypi的賬號,然后創建~/.pypirc文件進行一些配置

[distutils]
index-servers = pypi

[pypi]
username:xxx
password:xxx

注冊項目
python3 setup.py register
成功注冊后,構建源碼包發布
python3 setup.py sdist upload

最后的最后,別忘了README.mdLICENSE,最好再加上requirements.txt,可以參考文章開頭官網的打包流程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM