如何打包你的 Python 代码

使用 setuptools 向用户交付 Python 代码。
67 位读者喜欢这篇文章。
Python programming language logo with question marks

Opensource.com

你花费了数周时间来完善你的代码。你已经对其进行了测试,并将其发送给了一些亲密的开发者朋友进行质量保证。你已将所有源代码发布在你的个人 Git 服务器上,并且你已经收到了一些勇敢的早期采用者提供的有用的错误报告。现在你已准备好向全世界提供你的 Python 代码。

就在这时,你突然意识到。你不知道如何交付产品。

向目标交付代码是一件大事。它是软件开发的一个重要分支,是 CI/CD 中的“D”,但许多人至少在最后才想起它。我写过关于 Autotools 和 Cmake 的文章,但是有些语言有自己的方法来帮助你轻松地向用户提供代码。对于 Python,向用户交付代码的常用方法是使用 setuptools

安装 setuptools

安装和更新 setuptools 最简单的方法是使用 pip

$ sudo python -m pip install --upgrade setuptools

示例库

创建一个名为 myhellolib 的简单 Python 库,用于存放一些需要打包的示例代码。该库接受一个字符串,然后以大写字母打印该字符串。

它只有两行代码,但是项目结构很重要,所以首先创建目录树

$ 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

要使用 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 编码!

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,经常同时进行。

评论已关闭。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.