使用 setuptools 来向用户交付 Python 代码.
你花了几周的时间来完善你的代码. 你已经对它进行了测试, 并把它发送给一些亲近的开发者朋友以保证质量. 你已经将所有的源代码发布在 你的个人 Git 服务器 上, 并且从一些勇敢的早期使用者收到了一些有用的错误报告. 现在你已经准备好将你的 Python 代码提供给全世界.
就在这时你遇到一个问题. 你不知道如何交付产品.
将代码交付给它的目标用户是一件大事. 这是软件开发的一个完整的分支, 是 CI/CD 中的 "D", 但很多人都忘记了, 至少到最后才知道. 我写过关于 Autotools 和 Cmake https://opensource.com/article/21/5/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
要用 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 web 钩子, Jenkins 或类似的自动化工具来自动完成这个过程. 你甚至可以把你的项目上传到 PyPi, 这个流行的 Python 模块仓库. 一旦它在 PyPi 上, 用户就可以用 pip 来安装它, 就像你在这篇文章中安装 setuptools 和 build 一样!
当你坐下来开发一个应用或库时, 打包并不是你首先想到的事情, 但它是编程的一个重要方面. Python 开发者在程序员如何向世界提供他们的工作方面花了很多心思, 没有比 setuptools 更容易的了. 试用它, 使用它, 并继续用 Python 编码!
鸿蒙官方战略合作共建 --HarmonyOS 技术社区
来源: http://developer.51cto.com/art/202111/690909.htm