如何打包你的 Python 代碼
使用 setuptools 來(lái)向用戶交付 Python 代碼。
你花了幾周的時(shí)間來(lái)完善你的代碼。你已經(jīng)對(duì)它進(jìn)行了測(cè)試,并把它發(fā)送給一些親近的開發(fā)者朋友以保證質(zhì)量。你已經(jīng)將所有的源代碼發(fā)布在 你的個(gè)人 Git 服務(wù)器 上,并且從一些勇敢的早期使用者收到了一些有用的錯(cuò)誤報(bào)告?,F(xiàn)在你已經(jīng)準(zhǔn)備好將你的 Python 代碼提供給全世界。
就在這時(shí)你遇到一個(gè)問題。你不知道如何交付產(chǎn)品。
將代碼交付給它的目標(biāo)用戶是一件大事。這是軟件開發(fā)的一個(gè)完整的分支,是 CI/CD 中的 “D”,但很多人都忘記了,至少到最后才知道。我寫過關(guān)于 Autotools 和 Cmake 的文章,但有些語(yǔ)言有自己的方法來(lái)幫助你將你的代碼提供給用戶。對(duì)于 Python 來(lái)說,向用戶提供代碼的一個(gè)常見方法是使用 setuptools。
安裝 setuptools
安裝和更新 setuptools 的最簡(jiǎn)單方法是使用 pip:
$ sudo python -m pip install --upgrade setuptools
示例庫(kù)
我創(chuàng)建了一個(gè)簡(jiǎn)單的 Python 庫(kù),名為 myhellolib,來(lái)作為需要打包的示例代碼。這個(gè)庫(kù)接受一個(gè)字符串,然后用大寫字母打印出這個(gè)字符串。
它只有兩行代碼,但項(xiàng)目結(jié)構(gòu)很重要,所以首先創(chuàng)建目錄樹:
$ mkdir -p myhellolib.git/myhellolib
為了確認(rèn)這個(gè)項(xiàng)目是一個(gè)可導(dǎo)入的庫(kù)(即 Python “模塊”),在代碼目錄中創(chuàng)建一個(gè)空文件 __init__.py,同時(shí)創(chuàng)建一個(gè)包含代碼的文件:
$ touch myhellolib.git/myhellolib/__init__.py$ touch myhellolib.git/myhellolib/myhellolib.py
在 myhellolib.py 文件中,輸入簡(jiǎn)單的 Python 代碼:
def greeter(s):print(s.upper())
這就是寫好的庫(kù)。
測(cè)試它
在打包之前,測(cè)試一下你的庫(kù)。創(chuàng)建一個(gè) myhellolib.git/test.py 文件并輸入以下代碼:
import myhellolib.myhellolib as hellohello.greeter("Hello Opensource.com.")
運(yùn)行該腳本:
$ cd myhellolib.git$ python ./test.pyHELLO OPENSOURCE.COM
它可以工作,所以現(xiàn)在你可以把它打包了。
Setuptools
要用 setuptools 打包一個(gè)項(xiàng)目,你必須創(chuàng)建一個(gè) .toml 文件,將 setuptools 作為構(gòu)建系統(tǒng)。將這段文字放在項(xiàng)目目錄下的 myhellolib.toml 文件中。
[build-system]requires = ["setuptools", "wheel"]build-backend = "setuptools.build_meta"
接下來(lái),創(chuàng)建一個(gè)名為 setup.py 的文件,包含項(xiàng)目的元數(shù)據(jù):
from setuptools import setupsetup(name='myhellolib',version='0.0.1',packages=['myhellolib'],install_requires=['requests','importlib; python_version == "3.8"',],)
不管你信不信,這就是 setuptools 需要的所有設(shè)置。你的項(xiàng)目已經(jīng)可以進(jìn)行打包。
打包 Python
要?jiǎng)?chuàng)建你的 Python 包,你需要一個(gè)構(gòu)建器。一個(gè)常見的工具是 build,你可以用 pip 安裝它:
$ python -m pip install build --user
構(gòu)建你的項(xiàng)目:
$ python -m build
過了一會(huì)兒,構(gòu)建完成了,在你的項(xiàng)目文件夾中出現(xiàn)了一個(gè)新的目錄,叫做 dist。這個(gè)文件夾包含一個(gè) .tar.gz 和一個(gè) .whl 文件。
這是你的第一個(gè) Python 包! 下面是包的內(nèi)容:
$ tar --list --file dist/myhellolib-0.0.1.tar.gzmyhellolib-0.0.1/myhellolib-0.0.1/PKG-INFOmyhellolib-0.0.1/myhellolib/myhellolib-0.0.1/myhellolib/__init__.pymyhellolib-0.0.1/myhellolib/myhellolib.pymyhellolib-0.0.1/myhellolib.egg-info/myhellolib-0.0.1/myhellolib.egg-info/PKG-INFOmyhellolib-0.0.1/myhellolib.egg-info/SOURCES.txtmyhellolib-0.0.1/myhellolib.egg-info/dependency_links.txtmyhellolib-0.0.1/myhellolib.egg-info/requires.txtmyhellolib-0.0.1/myhellolib.egg-info/top_level.txtmyhellolib-0.0.1/setup.cfgmyhellolib-0.0.1/setup.py$ unzip -l dist/myhellolib-0.0.1-py3-none-any.whlArchive: dist/myhellolib-0.0.1-py3-none-any.whlName----myhellolib/__init__.pymyhellolib/myhellolib.pymyhellolib-0.0.1.dist-info/METADATAmyhellolib-0.0.1.dist-info/WHEELmyhellolib-0.0.1.dist-info/top_level.txtmyhellolib-0.0.1.dist-info/RECORD-------6 files
讓它可用
現(xiàn)在你知道了打包你的 Python 包是多么容易,你可以使用 Git 鉤子、GitLab Web 鉤子、Jenkins 或類似的自動(dòng)化工具來(lái)自動(dòng)完成這個(gè)過程。你甚至可以把你的項(xiàng)目上傳到 PyPi,這個(gè)流行的 Python 模塊倉(cāng)庫(kù)。一旦它在 PyPi 上,用戶就可以用 pip 來(lái)安裝它,就像你在這篇文章中安裝 setuptools 和 build 一樣!
當(dāng)你坐下來(lái)開發(fā)一個(gè)應(yīng)用或庫(kù)時(shí),打包并不是你首先想到的事情,但它是編程的一個(gè)重要方面。Python 開發(fā)者在程序員如何向世界提供他們的工作方面花了很多心思,沒有比 setuptools 更容易的了。試用它,使用它,并繼續(xù)用 Python 編碼!






























