手把手教你制作一个Python打包程序

本文详细指导如何将Python项目打包成Package,包括设置文件结构、配置pyproject.toml、创建元数据、生成分发档案,并上传到PyPI。涵盖了从安装依赖、创建包到上传测试流程的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近感兴趣想将开发的项目转成Package,研究了一下相关文章,并且自己跑通了,走了一下弯路,这里记录一下如何打包一个简单的Python项目,展示如何添加必要的文件和结构来创建包,如何构建包,以及如何将其上传到Python包索引(PyPI)。

首先要确保安装最新版本:

# Unix/macOS
python3-m pip install--upgrade pip
# windows
py-m pip install--upgrade pip

对Python感兴趣的话,文末领取全套最新Python学习资源,祝你一臂之力!

一个简单的项目

本教程使用一个名为example_package_YOUR_USERNAME_HERE的简单项目。如果你的用户名是me,那么包将会是example_package_me;另外确保有一个唯一的包名,不会与遵循本教程的其他人上传的包冲突。建议在打包自己的项目之前,按照本教程的原样使用这个项目。

在本地创建以下文件结构:

packaging_tutorial/
└── src/
    └── example_package_YOUR_USERNAME_HERE/
        ├── __init__.py
        └── example.py

包含Python文件的目录应该与项目名称匹配。这简化了配置,对于安装包的用户来说更加明显。

__init__. py是将目录导入为包所必需的,即使在本教程中,该文件是空的。

example.py是包内模块的示例,该模块可能包含包的逻辑(函数、类、常量等)。打开该文件并输入以下内容:

def add_one(number):
    return number + 1

创建此结构后,需要在packaging_tutorial目录中运行本教程中的所有命令。

创建包文件

现在将添加用于准备项目以进行分发的文件。完成后,项目结构将如下所示:

packaging_tutorial/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│   └── example_package_YOUR_USERNAME_HERE/
│       ├── __init__.py
│       └── example.py
└── tests/

创建测试目录

test/是测试文件的占位符,这里暂时将其留空。

选择构建后端

pipbuild这样的工具实际上不会将源代码转换为分发包(如轮子);该工作由构建后端执行。构建后端决定您的项目将如何指定其配置,包括元数据(有关项目的信息,例如,PyPI上显示的名称和标签)和输入文件。构建后端具有不同级别的功能,例如它们是否支持构建扩展模块,应该选择适合需求和偏好的一个。

这里可以从许多后端中进行选择;本教程默认使用Hatchling,但它将与支持元数据的setuptoolsFlightPDM和其他支持[project]表的方法相同。

pyproject.toml告诉构建前端工具,如pipbuild,为项目使用哪个后端。以下是一些常见构建后端的示例,但请查看后端自己的留档以获取更多详细信息。

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[build-system]
requires = ["flit_core>=3.4"]
build-backend = "flit_core.buildapi"

[build-system]
requires = ["pdm-backend"]
build-backend = "pdm.backend"

requires键是构建包所需的包列表。前端应该在构建包时自动安装它们。前端通常在隔离的环境中运行构建,因此在这里省略依赖项可能会导致构建时错误。这应该始终包括后端的包,并且可能有其他构建时依赖项。

build-backend键是前端用来执行构建的Python对象的名称。

这两个值都将由构建后端的留档提供,或者由其命令行界面生成,不需要自定义这些设置。

构建工具的其他配置将在pyproject.toml工具部分或构建工具定义的特殊文件中。例如,当使用setuptools作为构建后端时,可以将其他配置添加到setup.pysettings.cfg文件,并指定setuptools。build_meta在构建中允许工具自动定位和使用这些。

Python学习资料我已经上传至CSDN官方,如果需要可以扫描下方二维码都可以免费获取【保证100%免费】

配置元数据

打开pyproject.toml并输入以下内容。更改name以包含用户名;这可确保拥有唯一的包名,不会与遵循本教程的其他人上传的包冲突。

[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
  { name="Example Author", email="author@example.com" },
]
description = "A small example package"
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]

[project.urls]
"Homepage" = "https://github.com/pypa/sampleproject"
"Bug Tracker" = "https://github.com/pypa/sampleproject/issues"

  • name是包的分发名称。它可以是任何名称,只要它只包含字母、数字、._-。它也不能已经在PyPI上使用。在本教程中,请务必使用自己的用户名更新它,因为这可以确保不会尝试上传与已存在的名称相同的包。
  • version是包版本。有关版本的更多详细信息,请参阅版本说明符规范。一些构建后端允许以其他方式指定它,例如从文件或git tag。
  • authors用于标识包的作者;可以为每个作者指定姓名和电子邮件。还可以以相同的格式列出maintainers
  • description是对包装的简短的一句话总结。
  • readme是包含包的详细描述的文件的路径。这显示在PyPI上的包详细信息页面上。在这种情况下,描述是从README.md加载的(这是一种常见的模式)。项目元数据规范中还有一种更高级的表格形式。
  • requires-python提供项目支持的Python版本。像pip这样的安装程序会回顾旧版本的包,直到找到一个具有匹配Python版本的包。
  • classifiers提供有关包的索引和pip一些附加元数据。在这种情况下,包仅与Python3兼容,根据MIT许可证获得许可,并且OS独立。您应该始终至少包括包适用于Python的哪个版本,包在哪个许可证下可用,以及包将适用于哪些操作系统。有关分类器的完整列表,请参阅pypi.org/classifiers…
  • URL允许列出要在PyPI上显示的任意数量的额外链接。通常这可能是指向源、留档、问题跟踪器等。

有关可以在[project]表中定义的这些和其他字段的详细信息,请参阅项目元数据规范。其他常见字段是提高可发现性的关键字和安装包所需的依赖项

创建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.

创建LICENSE

上传到Python包索引的每个软件包都必须包含许可证。这将告诉安装软件包的用户他们可以使用上传软件包的条款。有关选择许可证的帮助,请参阅choosealicense.com/。选择许可证后,打开`…

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.

大多数构建后端会自动在包中包含许可证文件。有关详细信息,请参阅后端的留档。

包括其他文件

上面列出的文件将自动包含在源发行版中。如果想包含其他文件,请参阅构建后端的留档。

生成分发档案

下一步是为包生成分发包。这些是上传到Python包索引的存档,可以通过pip安装。确保安装了最新版本的PyPA bulid

# Unix/macOS
python3 -m pip install --upgrade build
# Windows
py -m pip install --upgrade build

现在从pyproject. toml所在的同一目录运行下面的命令:

# Unix/macOS
python3 -m build
# Windows
py -m build

这个命令应该输出很多文本,一旦完成应该在dist目录中生成两个文件:

dist/
├── example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
└── example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz

tar.gz文件是源发行版,而.whl文件是构建发行版。较新的pip版本优先安装构建发行版,但如果需要可以回退到源发行版。应该始终上传源发行版,并为项目兼容的平台提供构建发行版。在这种情况下,本文的示例包与任何平台上的Python兼容,因此只需要一个构建发行版。

对Python感兴趣的话,文末领取全套最新Python学习资源,祝你一臂之力!

上传分发档案

最后将打好的包上传到Python包索引,可供其它人安装。需要做的第一件事是在TestPyPI上注册一个帐户,这是一个用于测试和实验的包索引的单独实例。对于像本教程这样不一定想上传到真实索引的东西,这样的测试环境是非常好的。

首先要注册一个帐户,打开test.pypi.org/account/reg…

要安全地上传项目,还需要一个PyPIAPI令牌test.pypi.org/manage/acco…**

这一步需要QR扫描二维码,得到6位数字验证码,另外获得的令牌如何使用呢?这是踩的弯路,详细说一下:

PyPi 调整了安全策略,不再允许启用两步验证的账号使用用户名密码来上传项目了,必须使用 API 令牌来进行身份验证。登录 PyPi ,进入账户设置页,点击「添加 API 令牌」按钮创建 API 令牌。然后修改 ~/.pypirc 配置文件, 用户名字段改为 __token__ ,密码字段改为刚才创建的令牌:

[testpypi]
  username = __token__
  password = pypi-AgENdGVzdC5weXBpLm9xxxxxxxxxxxxxxx

注册好之后就可以使用twine上传分发包。上传之前需要先安装Twine:

# Unix/macOS
python3 -m pip install --upgrade twine
# Windows
py -m pip install --upgrade twine

安装后,运行Twine上传dist下的所有存档:

# Unix/macOS
python3 -m twine upload --repository testpypi dist/*
# Windows
py -m twine upload --repository testpypi dist/*

命令完成后,您应该会看到类似于以下内容的输出:

Uploading distributions to https://test.pypi.org/legacy/
Enter your username: __token__
Uploading example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.2/8.2 kB • 00:01 • ?
Uploading example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.8/6.8 kB • 00:00 • ?

上传后,打的包应该可以在TestPyPI上查看;例如:https://test.pypi.org/project/example_package_YOUR_USERNAME_HERE

package.png|inline

安装新上传的包

上传成果后,可以使用pip安装包并验证它是否有效。创建一个虚拟环境并从TestPyPI安装上传的包:

# Unix/macOS
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package-YOUR-USERNAME-HERE
# Windows
py -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package-YOUR-USERNAME-HERE

pip应该从TestPyPI安装包,输出应该如下所示:

Collecting example-package-YOUR-USERNAME-HERE
  Downloading https://test-files.pythonhosted.org/packages/.../example_package_YOUR_USERNAME_HERE_0.0.1-py3-none-any.whl
Installing collected packages: example_package_YOUR_USERNAME_HERE
Successfully installed example_package_YOUR_USERNAME_HERE-0.0.1

注 此示例使用--index-url标志来指定TestPyPI而不是live PyPI。此外,它还指定--no-deps。由于TestPyPI没有与live PyPI相同的软件包,因此尝试安装依赖项可能会失败或安装意外的东西。虽然我们的示例包没有任何依赖项,但在使用TestPyPI时避免安装依赖项是一个很好的做法。

接下来就可以通过导入软件包来测试它是否已正确安装。确保仍在虚拟环境中,然后运行Python:

from example_package_YOUR_USERNAME_HERE import example

example.add_one(2)
# 3

后续

恭喜,已成果打包并分发了一个Python项目!

请记住,本教程展示了如何将包上传到Test PyPI,这不是永久存储。Test系统偶尔会删除包和帐户。最好像本教程一样使用TestPyPI进行测试和实验。

当准备好将真实包上传到Python包索引时,可以像本教程中一样执行相同的操作,但有以下重要区别:

  • 为包选择一个难忘且独特的名称;
  • pypi.org上注册一个帐户,这是两个独立的服务器,测试服务器的登录详细信息不与主服务器共享;
  • 使用twine上传dist/*上传自己的包,并输入正式PyPI环境上注册的帐户的凭据。在生产环境中上传包,不需要指定--repository;默认情况下,包将上传到pypi.org/;
  • 使用python3-m pip install[your-package]从真正的PyPI安装包;
    以上就是今天的全部内容分享,觉得有用的话欢迎点赞收藏哦!

Python经验分享

学好 Python 不论是用于就业还是做副业赚钱都不错,而且学好Python还能契合未来发展趋势——人工智能、机器学习、深度学习等。
小编是一名Python开发工程师,自己整理了一套最新的Python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。如果你也喜欢编程,想通过学习Python转行、做副业或者提升工作效率,这份【最新全套Python学习资料】 一定对你有用!

小编为对Python感兴趣的小伙伴准备了以下籽料 !

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑培训的!

  • 学习时间相对较短,学习内容更全面更集中
  • 可以找到适合自己的学习方案

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、Python量化交易等学习教程。带你从零基础系统性的学好Python!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


最新全套【Python入门到进阶资料 & 实战源码 &安装工具】(安全链接,放心点击)

我已经上传至CSDN官方,如果需要可以扫描下方官方二维码免费获取【保证100%免费】

*今天的分享就到这里,喜欢且对你有所帮助的话,记得点赞关注哦~下回见 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值