打包 python 项目

本教程将指导您介绍如何打包一个简单的 python 项目。它将向您展示如何添加创建包所需的文件和结构, 如何生成包, 以及如何将其上载到 python 包索引。

一个简单的项目

本教程使用一个名为的简单项目。如果您不熟悉 python 的模块和导入包, 请花几分钟时间阅读python 文档中的包和模块。即使您已经有一个要打包的项目, 我们也建议您按照本教程进行操作, 同时使用此示例包, 然后尝试使用您自己的包。example_pkg

若要在本地创建此项目, 请创建以下文件结构:

/packaging_tutorial
  /example_pkg
    __init__.py

创建此结构后, 您需要在顶级文件夹中运行本教程中的所有命令, 因此请务必这样做。cd packaging_tutorial

您还应该编辑并将以下代码放在其中:example_pkg/__init__.py

name = "example_pkg"

这只是为了让您可以在本教程的稍后部分验证它是否正确安装。

创建包文件

现在, 您将创建一些文件来打包此项目并准备分发。创建下面列出的新文件-您将在以下步骤中向其中添加内容。

/packaging_tutorial
  /example_pkg
    __init__.py
  setup.py
  LICENSE
  README.md

创建设置.

setup.py设置工具的生成脚本。它告诉设置工具有关您的包 (如名称和版本) 以及要包括哪些代码文件。

打开并输入以下内容。您应该更新包名称以包括您的用户名 (例如,。如果您希望:setup.pyexample-pkg-theacodes

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="example-pkg-your-username",
    version="0.0.1",
    author="Example Author",
    author_email="author@example.com",
    description="A small example package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)

setup()采取了几个参数。此示例包使用相对最小的集:

  • name是包的分发名称。这可以是任何名称, 只要只包含字母、数字和。它也不能已经在 pypi. org 上使用。请务必使用您的用户名更新此内容,因为这可确保您在上载包时不会遇到任何名称冲突。_-
  • version是软件包版本, 请参阅 pep 440 有关版本的更多详细信息。
  • author并用于识别包裹的作者。author_email
  • description是一个简短的, 一句话的总结包。
  • long_description是包的详细说明。这显示在 python 包索引上的包详细信息包中。在这种情况下, 加载长说明, 从这是一个常见的模式。README.md
  • long_description_content_type告诉索引用于长描述的标记类型。在这种情况下, 是马克当。
  • url是项目主页的 url。对于许多项目, 这只是一个指向 github、GitHub、bitwb 或类似代码托管服务的链接。
  • packages是应包含在分发包中的所有 python 导入包的列表。我们可以使用自动发现所有包和子包, 而不是手动列出每个包。在这种情况下, 包的列表将是示例 _ pkgfind_packages()
  • classifiers告诉索引, 并提供有关包的其他元数据。在这种情况下, 包只与 python 3 兼容, 是根据 mit 许可证授权的, 并且是独立于 os 的。您应始终至少包括包的 python 版本、包可用的许可证以及包将使用的操作系统。有关分类器的完整列表, 请参阅https://pypi.org/classifiers/

这里提到的还有更多的东西。有关详细信息, 请参阅打包和分发项目

创建 readme. md

打开并输入以下内容。如果您愿意, 您可以自定义此选项。README.md

# Example Package

This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.

创建许可证

对于上载到 python 包索引的每个包都包含许可证非常重要。这将告知安装您的软件包的用户可以使用您的软件包的条款。有关选择许可证的帮助, 请参阅https://choosealicense.com/。选择许可证后, 打开并输入许可证文本。例如, 如果您选择了 mit 许可证:LICENSE

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

生成分发存档

下一步是为包生成分发包 。这些是上载到包索引的存档, 可以通过安装。

请确保您拥有最新版本的:setuptoolswheel

python3 -m pip install --user --upgrade setuptools wheel

小贴士

如果您在安装这些文件时遇到问题, 请参阅安装包教程.

现在, 从位于的同一目录中运行此命令:setup.py

python3 setup.py sdist bdist_wheel

此命令应输出大量文本, 完成后应在目录中生成两个文件:dist

dist/
  example_pkg_your_username-0.0.1-py3-none-any.whl
  example_pkg_your_username-0.0.1.tar.gz

注解

如果您在这里遇到麻烦, 请复制输出并将包装问题归档,我们将尽最大努力为您提供帮助!

该文件是源存档 , 而该文件是生成的分发。较新的点版本优先安装生成的发行版, 但如果需要, 将返回到源存档。您应该始终上传源存档, 并为项目与之兼容的平台提供生成的存档。在这种情况下, 我们的示例包在任何平台上都与 python 兼容, 因此只需要一个构建的分发。tar.gz.whl

上传分发档案

最后, 是时候将您的包上传到 python 包索引了!

您需要做的第一件事是在测试 pypi上注册一个帐户。测试 pypi 是用于测试和实验的包索引的一个单独实例。这对于像本教程这样的东西来说是很好的, 我们不一定想上传到真正的索引。若要注册帐户, 请转到 https://test.pypi.org/account/register/并完成该页面上的步骤。您还需要先验证您的电子邮件地址, 然后才能上传任何软件包。有关测试 pypi 的详细信息, 请参阅使用 testypi

现在您已经注册, 您可以使用线上传分发包。您需要安装 twine:

python3 -m pip install --user --upgrade twine

安装完成后, 运行 twine 上传以下所有存档:dist

python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

系统将提示您输入在测试 pypi 中注册的用户名和密码。命令完成后, 您应该会看到类似于以下内容的输出:

Uploading distributions to https://test.pypi.org/legacy/
Enter your username: [your username]
Enter your password:
Uploading example_pkg_your_username-0.0.1-py3-none-any.whl
100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s]
Uploading example_pkg_your_username-0.0.1.tar.gz
100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]

上传后, 您的软件包应该可以在 testpypi 上查看,例如, https://test.pypi.org/project/example-pkg-your-username

安装新上传的软件包

您可以使用pip 安装您的包, 并验证它是否有效。创建新的虚拟程序 (有关详细说明, 请参阅安装包 ), 并从 testpypi 安装包:

python3 -m pip install --index-url https://test.pypi.org/simple/ example-pkg-your-username

请确保在包名称中指定您的用户名!

pip 应该从 test pypi 安装软件包, 输出应如下所示:

Collecting example-pkg-your-username
  Downloading https://test-files.pythonhosted.org/packages/.../example-pkg-your-username-0.0.1-py3-none-any.whl
Installing collected packages: example-pkg-your-username
Successfully installed example-pkg-your-username-0.0.1

您可以通过导入模块并引用前面输入的属性来测试它是否已正确安装。name__init__.py

运行 python 解释器 (确保您仍在虚拟化中):

python

然后导入模块并打印出属性。无论您在哪个名称中为分发包 (在本例中为) 指定的内容 , 这都应该是相同的, 因为您的导入包是相同的。namesetup.pyexample-pkg-your-usernameexample_pkg

> > >

>>> import example_pkg
>>> example_pkg.name
'example_pkg'

后续步骤

恭喜您, 您已经打包并分发了一个 python 项目!

请记住, 本教程向您展示了如何将包上载到 test pypi, 这不是永久存储。测试系统偶尔会删除包和帐户。如果您想将您的包上传到真正的 python 包索引, 您可以通过注册 https://pypi.org 上的帐户并遵循相同的说明来完成, 但是, 使用它来上传您的包并输入您的帐户的凭据注册在真正的 pypi。您可以使用真正的 pypi 安装您的软件包。twine upload dist/*pip install [your-package]

在这一点上, 如果你想阅读更多关于打包 python 库, 这里有一些你可以做的事情: