Python將自己寫的模組進行打包
將專案打包成模組的想法來自於flask文件教程,這不是在PyCon上和阿明合了照嘛,這不得多看看人家的東西。有興趣的可以看看文件的專案可安裝化部分,作者將flask專案打包成一個包,使其可以再任何地方匯入專案並允許,也可以通過
pip install youproject.whl
的方式來安裝專案並安裝相關的依賴。
可以先瞄一眼官方的打包指南:跳轉
1.setuptools簡介
setuptools
是distutils
(自行百度)增強版。其擴充套件了很多功能,能夠幫助開發者更好的建立和分發 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
複製所有
static
和templates
資料夾中的檔案,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.md
和LICENSE
,最好再加上requirements.txt
,可以參考文章開頭官網的打包流程