你花了几周的时间来完善你的代码。你已经对它进行了测试,并将它发送给一些亲密的开发者朋友以保证质量。你已经将所有的源代码发布在你的个人 Git 服务器上,并且你已经收到了一些勇敢的早期采用者的有用的错误报告。现在你已经准备好将你的 Python 代码提供给全世界。
就在这时,你被击中了。你不知道如何交付产品。
将代码交付给它的目标是一件大事。它是软件开发的一个完整的分支,是CI/CD中的 "D",但许多人却忘记了这一点,至少在最后一刻。我写过关于Autotools和Cmake的文章,但有些语言有自己的方法来帮助你将你的代码随时提供给用户。对于Python来说,向用户提供代码的一个常见方法是setuptools 。
安装setuptools
安装和更新setuptools 的最简单方法是使用pip 。
$ sudo python -m pip install --upgrade setuptools
示例库
为一些需要打包的示例代码创建一个简单的 Python 库,名为myhellolib 。这个库接受一个字符串,然后用大写字母打印出这个字符串。
这是两行代码,但项目结构很重要,所以首先创建目录树。
$ mkdir -p myhellolib.git/myhellolib
为了确认这个项目是一个可导入的库 (Python "模块"),在代码目录中创建一个空文件__init__.py ,同时创建包含代码的文件。
$ touch myhellolib.git/myhellolib/__init__.py
$ touch myhellolib.git/myhellolib/myhellolib.py
在myhellolib.py 文件中,输入这个简单的 Python 代码。
def greeter(s):
print(s.upper())
这就是写好的库。
测试它
在打包之前,测试一下你的库。创建一个myhellolib.git/test.py 文件并输入这段代码。
import myhellolib.myhellolib as hello
hello.greeter("Hello Opensource.com.")
运行该脚本。
$ cd myhellolib.git
$ python ./test.py
HELLO OPENSOURCE.COM
它成功运行了,所以现在你可以把它打包了。
设置工具
要用setuptools 来打包一个项目,你必须创建一个.toml 文件,将setuptools 作为构建系统。把这段文字放在你的项目目录下一个叫做myhellolib.toml 的文件中。
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
接下来,创建一个名为setup.py 的文件,其中包含关于你的项目的元数据。
from setuptools import setup
setup(
name='myhellolib',
version='0.0.1',
packages=['myhellolib'],
install_requires=[
'requests',
'importlib; python_version == "3.8"',
],
)
信不信由你,这就是setuptools 所需要的全部设置。你的项目已经准备好了,可以打包了。
包装 Python
为了创建你的 Python 包,你需要一个构建器。一个常用的工具是build ,你可以用pip 安装它。
$ python -m pip install build --user
构建你的项目。
$ python -m build
片刻之后,构建完成,在你的项目文件夹中出现了一个新的目录,叫做dist 。这个文件夹包含一个.tar.gz 和一个.whl 文件。
你的第一个 Python 包!下面是每一个所包含的内容。
$ tar --list --file dist/myhellolib-0.0.1.tar.gz
myhellolib-0.0.1/
myhellolib-0.0.1/PKG-INFO
myhellolib-0.0.1/myhellolib/
myhellolib-0.0.1/myhellolib/__init__.py
myhellolib-0.0.1/myhellolib/myhellolib.py
myhellolib-0.0.1/myhellolib.egg-info/
myhellolib-0.0.1/myhellolib.egg-info/PKG-INFO
myhellolib-0.0.1/myhellolib.egg-info/SOURCES.txt
myhellolib-0.0.1/myhellolib.egg-info/dependency_links.txt
myhellolib-0.0.1/myhellolib.egg-info/requires.txt
myhellolib-0.0.1/myhellolib.egg-info/top_level.txt
myhellolib-0.0.1/setup.cfg
myhellolib-0.0.1/setup.py
$ unzip -l dist/myhellolib-0.0.1-py3-none-any.whl
Archive: dist/myhellolib-0.0.1-py3-none-any.whl
Name
----
myhellolib/__init__.py
myhellolib/myhellolib.py
myhellolib-0.0.1.dist-info/METADATA
myhellolib-0.0.1.dist-info/WHEEL
myhellolib-0.0.1.dist-info/top_level.txt
myhellolib-0.0.1.dist-info/RECORD
-------
6 files
总结
现在你知道了打包你的 Python 包是多么容易,你可以使用 Git 钩子、GitLab webhooks、Jenkins 或类似的自动化工具来自动化这个过程。你甚至可以把你的项目上传到PyPi,这个流行的Python模块仓库。一旦它在PyPi上,用户就可以使用pip ,就像你为本文安装setuptools 和build 一样!
当你坐下来开发一个应用程序或库时,它并不经常是你首先想到的事情,但打包代码是编程的一个重要方面。Python 开发者在程序员如何向世界提供他们的工作方面花了很多心思,而且没有比setuptools 更容易的了。 试一试,用一用,继续用 Python 编码!