當我們完成一個完整的項目,需要該項目檔案中打包成分發包共享給他人或者上傳到pypi社群以供他人下載下傳。這就需要對該項目進行打包分發。
項目檔案
這是一個已寫好的項目檔案包,叫做my_pkg,它的目錄結構如下:
tutorial/my_pkg/
__init__.py
main.py
utils/
__init__.py
other.py
在my_pkg中有兩個檔案和一個子包utils,現在我們需要對這個my_pkg進行打包。
建立封包件和setup.py檔案
my_pkg是将打包的Python封包件,在my_pkg的同級目錄下分别建立以下檔案:
setup.py ---- 打包腳本檔案,執行該腳本将自動完成打包
LICENCE ---- 許可證檔案
README ---- 包的介紹和說明
建立後檔案目錄結構如下:
tutorial/my_pkg/
__init__.py
main.py
utils/
__init__.py
other.py
setup.py
LICENCE
README
setup.py配置
打開setup.py檔案,寫入以下内容,
import setuptools #導入setuptools, 基于setuptools子產品進行打包分發
#将readme檔案中内容加載進來,作為對包的詳細說明(可以不需要)
with open("README.md", "r") as fh:
long_description=fh.read()#調用setuptools的setup進行打包,通過參數配置指定包的資訊,這是打包的關鍵設定
setuptools.setup(
name="my_pkg", #這是該包的名字,将來可能使用pip install 該包名直接下載下傳
version="0.0.1", #版本号,
author="Example Author", #作者
author_email="[email protected]", #作者郵箱
description="A small example package", #包簡短的描述
long_description=long_description, #詳細的描述,這裡使用從readme中讀取的内容
long_description_content_type="text/markdown", #較長的描述來源檔案的檔案類型,這裡使用markdomn
url="https://github.com/pypa/my_pkg", #可以将項目上傳到github,gitlab等,在此指定連結位址以供下載下傳。
#指定需要打包的内容,輸入需要打包包名字元串清單,打包時不會自動擷取子包,需要手動指定,例如:["my_pkg", "mypkg.utils"]
packages=setuptools.find_packages(), #使用該函數可以自動打包該同級目錄下所有包
classifiers=[ #指定一些包的中繼資料資訊,例如使用的協定,作業系統要求
"Programming Language :: Python :: 3","License :: OSI Approved :: MIT License","Operating System :: OS Independent",
],
python_requires='>=3.6', #該包的Python版本要求
)
這些是對打包行為的一些配置,setup.py中除了上述内容,還可以添加包括以下屬性資訊
name package name
version (-V) package version
fullname-author the author's name
author-email the author's email address
maintainer the maintainer's name
maintainer-email the maintainer's email address
contact the maintainer's name if known, else the author's
contact-email the maintainer's email address if known
url the URL forthis package
license the license of the package
licencefor --license
description the package description
long-description the long package description
platforms the list of platforms
classifiers the list of classifiers
keywords the list of keywords
provides the list of packages/modules provided
requires the list of packages/modules required
obsoletes the list of packages/modules made obsolete
setup.py配置完成後,就可以執行這個檔案進行打包了(在指令行使用Python解釋器指定參數執行,不能直接執行),在此之前還有LICENCE和README兩個檔案需要完善(也可以不做處理,不影響打包執行)。
README
這個檔案是該包的詳細說明檔案,包括各種資訊,例如該包如何安裝,需要的環境,如何使用等詳細内容。
LICENCE
指定許可證資訊,開源軟體都遵循了不同的開源協定,這些協定規定了使用者使用該包後必須遵守的原則,可以檢視不同開源協定内容 https://choosealicense.com/ ,選則一個協定,複制對應的協定内容到該檔案中即可。
通過setup.py生成分發包
setup.py檔案配置完成後,就可以通過Python執行進行打包,使用cmd指令行工具打開終端,cd 到setup.py檔案所在目錄(windows 可以在檔案資料總管中的setup.py目錄上方路徑中直接cmd,直接在該目錄打開終端)
打包成wheel二進制包
這需要最新的setuptools 和 wheel包。執行以下指令更新
python -m pip install --user --upgrade setuptools wheel
執行該setup.py檔案并指定參數,指定打包為wheel二進制檔案
python setup.py sdist bdist_wheel
執行該指令後,該目錄下會多出三個目錄。在dist目錄下就是我們打包好的源代碼檔案(tar.gz)和wheel二進制檔案(.whl)
build
dist/my_pkg-0.0.1.tar.gz #被打包内容所有原代碼,按照原有的層級結構
my_pkg-0.0.1-py3-none-any-whl #可以通過pip install 直接安裝
my_pkg.egg-info
現在我們可以及将這個dist檔案夾中的内容共享給他人,也可以上傳pypi社群供他人下載下傳安裝,在得到這個dist包後,可以通過pip安裝指令直接安裝内部的.whl檔案
pip install my_pkg-0.0.1-py3-none-any-whl
該指令會将這個包安裝到python安裝目錄下/Lib/site-packages目錄下,使用pip list指令可以看到在清單中出現了名為my_pkg的包名,安裝成功。該包可以使用了。
如果将該包上傳到pypi社群供他人下載下傳,需要注意自己包名不要和其他貢獻者的包名相同,如何判斷是否重複,嘗試在未上傳前使用pip isntall 包名進行安裝,若沒有找到找到該package表示該名可用,也可以上pypi官網搜尋。上傳成功後,直接使用pip install 包名進行安裝。上傳pypi過程見官網示例https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives
打包為源碼包-sdist
通過wheel二進制檔案打包是目前較為流行的方式。除了wheel二進制檔案,我們還可以使用Python源代碼壓縮檔案形式進行打包。同樣在setup.py同級目錄下,進入cmd指令行,執行指令
python setup.py sdist
将會在建立dist和my_pkg.egg.info目錄。我們隻關心dist目錄,該目錄下有一個壓縮檔案,這個壓縮檔案包含了打包後的全部源碼。
dist/my_pkg-0.0.1.tar.gz
将該檔案發送給他人,可以直接使用pip install my_pkg-0.0.1.tar.gz直接安裝該包,同樣在使用pip list可以檢視到該包名。
另外,還可以解壓該源碼包,在setup.py目錄執行python setup.py install安裝該包。
二進制安裝程式-bdist
打包為二進制安裝包,生成目标作業系統的安裝程式。
生成windows 安裝程式
針對windows環境下,以下三條指令均可
python setup.py bdist_wininst
Python setup.py bdist_msi
python setup.py bdist--format=msi
建立一個dist目錄,生成一個安裝程式,在Windows上直接輕按兩下即可安裝該包。
生成rpm包
python setup.py bdist_rpm
python setup.py bdist-- format=rpm
在Linux系統中使用rpm指令進行安裝。
生成壓縮檔案
python setup.py bdist --format=zip
python setup.py bdist--format=gztar