官网打包Python项目
python3 -m pip install --upgrade pip
确定将要打包的名称,防止与其他人的按照此样例上传的包冲突,此名称必须唯一。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/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│ └── example_package_YOUR_USERNAME_HERE/
│ ├── __init__.py
│ └── example.py
└── tests/
tests/ 为测试目录,暂时为空。
告诉pip如何构建包。可以选择Hatchling、setuptools、Flit、PDM等工具。
打开pyproject.toml,从下面四个中选择一个,输入到文件中。
[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.2"]
build-backend = "flit_core.buildapi"
[build-system]
requires = ["pdm-pep517"]
build-backend = "pdm.pep517.api"
requires是构建包所需的包列表。不需要安装。
build-backend是用于执行构建的 Python 对象的名称。
打开pyproject.toml并输入以下内容。name与前面起的包名一致。必须唯一。
[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
{ name="Example Author", email="[email protected]" },
]
description = "A small example package"
readme = "README.md"
license = { file="LICENSE" }
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 标签。
authors用于标识包的作者;您为每个作者指定姓名和电子邮件。您也可以maintainers以相同的格式列出。
description是一个简短的、一句话的包摘要。
readme是包含包详细描述的文件的路径。这显示在 PyPI 的包详细信息页面上。在这种情况下,描述是从中加载的README.md(这是一种常见的模式)。项目元数据规范中还描述了一种更高级的表格形式 。
license是LICENSE文件的路径,如下所述。
requires-python给出项目支持的 Python 版本。像pip这样的安装程序会回顾旧版本的包,直到找到一个与 Python 版本匹配的包。
classifiers提供 index 和pip一些关于你的包的额外元数据。在这种情况下,该包仅与 Python 3 兼容,在 MIT 许可下获得许可,并且独立于操作系统。您应该始终至少包括您的包适用于哪个 Python 版本、您的包在哪个许可证下可用,以及您的包将在哪些操作系统上运行。有关分类器的完整列表,请参阅 https://pypi.org/classifiers/。
urls允许您列出要在 PyPI 上显示的任意数量的额外链接。通常,这可能是源、文档、问题跟踪器等。
详细参考项目元数据规范
打开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/。选择许可证后,打开 LICENSE并输入许可证文本。例如,如果您选择了 MIT 许可证:
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.
上面列出的文件将自动包含在您的 源代码分发中。如果要包含其他文件,请参阅构建后端的文档。
更新P有PA的build
python3 -m pip install --upgrade build
在pyproject.toml文件同一目录下,运行下面命令。
python3 -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
python3 -m pip install example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
python3
>>>from example_package_YOUR_USERNAME_HERE import example
>>>example.add_one(2)
2