跳转到主要内容

一个演示如何制作包的示例

项目描述

这是一个演示如何为PyPI上的分发打包您的代码的示例。这是2022年秋季的一种可能的方法。我不会讨论其他可能的方法。打包生态系统很复杂。讨论所有选项只会让人困惑。

这个仓库并不打算展示一个典型项目中所有的配置。例如,它没有测试,没有文档,也不使用linters或类型检查器。这些都是好事,你应该研究它们,但这个仓库只关注如何打包项目进行分发,省略了这些其他的好事,这样我们就可以专注于打包。

这个仓库中的文件中包含注释,以帮助您了解每个部分的作用,这样您就可以创建自己的文件,包含您需要的部分和细节。

如何使用此仓库

您有想要分发的代码。这个仓库是您如何配置项目的模型。复制这里的文件,取您需要的部分,省略您不需要的部分。

决策

在开始之前,您需要做出一些决定。

项目名称

您必须为项目选择一个名称。在这个仓库中,它是“pkgsample”,但您将选择一个不同的名称。您的项目名称将发挥几个不同的作用:它是导入的模块名称,仓库名称,也是PyPI上的名称。任何您看到“pkgsample”的地方,您都将将其更改为您的项目名称。

由于项目名称将是PyPI上的名称,您在做出决定之前应该检查您想要的名称是否已经存在。在PyPI上搜索您的名称以查看是否已被占用。

版本号

您软件包的版本号位于src/pkgsample/__init__.py文件中的__version__变量处。您在制作发行版时将更新此值。有关最初使用.devN后缀的说明,请参阅下文“上传测试”中的备注。

可选功能

此布局将安装您的模块,以便人们可以导入它们。还包括一个额外可能性。

  • 您可能需要安装一些命令,以便您的用户有新的命令行工具。这些部分用COMMANDS:标记。

在查看文件时注意观察,以了解如果不使用此选项可以省略什么。

项目详情

还有一些其他细节您可能想更改,但您不必这样做。

  • 许可协议:此仓库使用Apache许可证,但您可以选择不同的许可证。

  • 最低Python版本:此仓库需要Python 3.9或更高版本。也许您需要支持更多版本(选择更低的要求)或您希望使用一些较新的Python特性(选择更高的要求)。

文件中的注释,尤其是pyproject.toml文件,显示了您可以在哪里做出这些选择,并链接到可以帮助您的资源。

仓库中的内容

此仓库是制作可分发软件包的演示。您应检查这里的文件,决定哪些适合您,并将它们根据您的需求进行修改。

src/

此目录是您放置代码的地方。它应该有一个以您的项目命名的子目录,所有工作都放在该子目录中。

此仓库在src/pkgsample中包含一些小文件,只是为了构建和分发。您将删除该目录并为您自己的文件创建一个新子目录。

pyproject.toml

这是整个流程的核心。您将在该文件中进行很多更改。关于您项目的信息(名称、描述、作者等)以及许多其他细节都在这里指定。

README.rst

(此文件!) 您将用您自己的README.rst替换此文件,描述您的项目、如何安装它、如何使用它、如何获取帮助、变更日志等。

零散物品

.gitignore是一个标准的git文件,用于防止不感兴趣的文件被存储在git中。

LICENSE.txt是您选择的许可证的文本。

这里的一些文件对于分发项目不是必需的,但对我在这仓库中的工作很有用,您也可能觉得有用。

  • Makefile:组织在仓库中工作所需的命令。此README中显示的命令也在Makefile中作为目标提供。您可以使用make help来查看目标及其功能。

  • .editorconfig:指定简单的格式化规则,您的编辑器可以强制执行。

准备您的环境

为自己获取一个Python 3.9环境。使用virtualenv是推荐的,但不是必需的。

您需要一些工具来构建可安装的文件(称为发行版)。它们在dev-requirements.txt文件中指定。使用pip安装它们。

python -m pip install -r dev-requirements.txt
# or:  make tools

进行更改

如果您准备好了,您可以对项目进行所有更改。如果您愿意,您也可以跳过此步骤,使用pkgsample仓库的当前状态尝试一些后续步骤,看看会发生什么。

从此仓库复制文件,然后进行所有更改

  • 将您的项目源文件放在src/目录中。确保删除所有pkgsample代码的痕迹。

  • 使用所有选择的信息更新pyproject.toml文件。完成后,“pkgsample”一词不应在该文件中任何地方出现。

  • 完全重写README.rst文件,包括您项目的描述和详细信息。

本地安装

您可以通过在当前环境中作为“可编辑安装”安装项目来对项目进行一些初步测试。

python -m pip install -e .

这将使您的项目能够在当前Python环境中导入,您可以尝试运行代码。以下是一个使用pkgsample代码的示例

% python
Python 3.9.15 (main, Oct 24 2022, 17:23:01)
>>> from pkgsample.add import add
>>> add(17, 42)
59

如果您正在创建命令行命令,现在就可以运行它们了

% pkgsample_add 1 2 3 4 5
Your numbers are: [1, 2, 3, 4, 5]
They add up to: 15

顺便说一句,这种可编辑的安装方式也是进行开发的好方法,因为Python将直接从您工作树中编辑的文件导入,所以修改代码并查看其效果非常快。

一旦您这样做,您将开始在代码附近看到 __pycache__ 目录。这些目录包含编译的字节码文件,名为 something.something.pyc。您可以安全地删除这些文件,.gitignore 文件将防止它们被存储在 git 中。

制作发行版

您现在已经准备好制作可安装的工件,称为发行版。

创建文件

这些命令将创建文件并检查它们的正确性

python -m build --sdist --wheel
    python -m twine check dist/*
# or:  make clean dist

如果一切顺利,现在您将有一个包含两个文件的 dist/ 目录

pkgsample-0.1.0-py3-none-any.whl
pkgsample-0.1.0.tar.gz

.whl 文件是“轮”。这是发行版的首选文件格式。.tar.gz 文件是“源发行版”(sdist),它也易于提供,并且某些用户更喜欢。

如果出现问题,twine check 命令将报告错误以修复。查看文件内容可能会有所帮助,或者您只是出于好奇。您可以检查内容

% tar tvfz dist/*.tar.gz
drwxr-xr-x  0 user group       0 Nov 15 06:25 pkgsample-0.1.0/
-rw-r--r--  0 user group   10177 Nov 15 05:07 pkgsample-0.1.0/LICENSE.txt
-rw-r--r--  0 user group   19222 Nov 15 06:25 pkgsample-0.1.0/PKG-INFO
-rw-r--r--  0 user group    6866 Nov 15 06:24 pkgsample-0.1.0/README.rst
-rw-r--r--  0 user group    2860 Nov 15 05:28 pkgsample-0.1.0/pyproject.toml
-rw-r--r--  0 user group      38 Nov 15 06:25 pkgsample-0.1.0/setup.cfg
drwxr-xr-x  0 user group       0 Nov 15 06:25 pkgsample-0.1.0/src/
drwxr-xr-x  0 user group       0 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample/
-rw-r--r--  0 user group     246 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample/__init__.py
-rw-r--r--  0 user group     166 Nov 15 05:07 pkgsample-0.1.0/src/pkgsample/add.py
-rw-r--r--  0 user group     410 Nov 15 05:07 pkgsample-0.1.0/src/pkgsample/add_cli.py
drwxr-xr-x  0 user group       0 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample.egg-info/
-rw-r--r--  0 user group   19222 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample.egg-info/PKG-INFO
-rw-r--r--  0 user group     333 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample.egg-info/SOURCES.txt
-rw-r--r--  0 user group       1 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample.egg-info/dependency_links.txt
-rw-r--r--  0 user group     113 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample.egg-info/entry_points.txt
-rw-r--r--  0 user group       5 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample.egg-info/requires.txt
-rw-r--r--  0 user group      10 Nov 15 06:25 pkgsample-0.1.0/src/pkgsample.egg-info/top_level.txt

发行版包含所有文件,以及包装过程中创建的新支持文件。

测试发行版

您可以测试安装发行版文件。创建一个新的虚拟环境,并直接从其中一个文件安装

python -m pip install /path/to/pkgsample-0.1.0-py3-none-any.whl

现在您应该能够导入并运行您的模块。

清理

dist/ 和 build/ 目录是此过程的组成部分。它们不会被存储在 git 中,并且您可以在想要清理时随时删除它们。Makefile 包含一个目标,可以为您执行此操作

make clean

上传到 PyPI

制作完整可安装包的最终一步是将您的发行版上传到 Python Package Index, PyPI。这是 pip 寻找要安装的包的地方。

(如果您一直在使用未更改的 pkgsample 存储库尝试这些步骤,您将无法这样做,因为您无法上传新的 pkgsample 发行版。)

实际上有两个 PyPI 实例:一个是真正的 https://pypi.ac.cn,还有一个测试实例 https://test.pypi.org/,您可以在将发行版实际发布之前尝试它们。

创建账户

https://pypi.ac.cn/account/register/https://test.pypi.org/account/register/ 上注册两个 PyPI 账户。PyPI 有许多选项来保护您的账户安全,但一个简单的用户名和密码就可以开始。

上传测试版

将您的发行版上传到 test.pypi.org。twine 工具执行此操作

python -m twine upload --verbose --repository testpypi dist/*
# or: make clean dist test_pypi

您将需要输入用户名和密码,进度将显示,最后您将获得一个网址,可以查看您发布的包页面将看起来像什么

% python -m twine upload --verbose --repository testpypi dist/*
Uploading distributions to https://test.pypi.org/legacy/
INFO     dist/pkgsample-0.1.1.dev0-py3-none-any.whl (10.4 KB)
INFO     dist/pkgsample-0.1.1.dev0.tar.gz (10.6 KB)
INFO     Querying keyring for username
Enter your username: your_username
INFO     Querying keyring for password
Enter your password:
INFO     username: your_username
INFO     password: <hidden>
Uploading pkgsample-0.1.1.dev0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.6/26.6 kB • 00:00 • 13.1 MB/s
INFO     Response from https://test.pypi.org/legacy/:
         200 OK
Uploading pkgsample-0.1.1.dev0.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 26.7/26.7 kB • 00:00 • 27.1 MB/s
INFO     Response from https://test.pypi.org/legacy/:
         200 OK

View at:
https://test.pypi.org/project/pkgsample/0.1.1.dev0/

注意:一旦您将文件上传到 PyPI(即使是测试服务器),您就不能修复问题并重新上传。您必须以某种方式增加版本号,才能上传更新的文件。在进行包装的第一轮测试时,使用 .devN 后缀是一个好主意,同时您在努力使其正确:__version__ = "0.1.0.dev0"

检查您的页面。确保一切看起来如您所愿,包括左侧侧栏中的元数据以及README的格式。如果需要修复某些内容,请增加版本号中的.devN后缀,重新制作发行版,并重新上传。

实际上传

一旦您的软件包在测试PyPI服务器上看起来正确,您就可以实际上传您的软件包了!

将版本号修正以去除.devN后缀,然后制作新的发行版,并将它们上传到PyPI。

rm -fr build/ dist/ src/*.egg-info
python -m build --sdist --wheel
python -m twine check dist/*
python -m twine upload --verbose dist/*
# or: make clean dist pypi

您的软件包现在可用

现在任何人都可以使用pip安装您的软件包

pip install pkgsample

你做到了!

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。

源发行版

pkgsample-0.1.1.tar.gz (15.3 kB 查看哈希值)

上传时间:

构建发行版

pkgsample-0.1.1-py3-none-any.whl (11.1 kB 查看哈希值)

上传时间: Python 3

由以下赞助商支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面