新建 GitHub 仓库
打开 https://github.com/new,新建一个公共仓库。
- 仓库名为 slmethod, 统计学习方法(Statistical Learning Method)的简写
- Public 公开仓库
- 勾选 Initialize this repository with a README
- .gitignore 选择 Python
- 添加 MIT License
源码地址:https://github.com/iOSDevLog/slmethod
下载代码到本地,使用 ssh
协议。
1 | git clone git@github.com:iOSDevLog/slmethod.git |
使用 cz-cli 提交代码。
1 | git cz |
打包 Python 项目
新建虚拟环境
1 | mkvirtualenv slm |
创建以下文件结构:
1 | slmethod |
编辑 slm/__init__.py
1 | name = "slm" |
创建 setup.py
setup.py
是 setuptools 的构建脚本。它告诉 setuptools
你的包(例如名称和版本)以及要包含的代码文件。
打开 setup.py
并输入以下内容,更新软件包名称以包含您的用户名。
1 | import setuptools |
setup()
需要几个论点。此示例包使用相对最小的集:
name
是包的 分发名称。只要包含字母,数字_
和,就可以是任何名称-
。它也不能在 pypi.org 上使用。请务必使用您的用户名更新此内容, 因为这样可确保您不会尝试上传与上传程序包时已存在的程序包相同的程序包。version
是包版本看 PEP 440 有关版本的更多详细信息。author
和author_email
用于识别包的作者。description
是一个简短的,一句话的包的总结。long_description
是包的详细说明。这显示在 Python Package Index 的包详细信息包中。在这种情况下,加载长描述README.md
是一种常见模式。long_description_content_type
告诉索引什么类型的标记用于长描述。这里是 Markdown 格式。url
是项目主页的 URL。对于许多项目,这只是一个指向 GitHub,GitLab,Bitbucket 或类似代码托管服务的链接。packages
是应包含在 分发包 中的所有 Python 导入包 的列表。我们可以使用 自动发现所有包和子包,而不是手动列出每个包。在这种情况下,包列表将是slm
因为它是唯一存在的包。find_packages()
classifiers
给出了指数和 pip 你的包一些额外的元数据。在这种情况下,该软件包仅与 Python 3 兼容,根据 MIT 许可证进行许可,并且与操作系统无关。您应始终至少包含您的软件包所使用的 Python 版本,软件包可用的许可证以及您的软件包将使用的操作系统。有关分类器的完整列表,请参阅 https://pypi.org/classifiers/。
除了这里提到的还有很多。有关详细信息,请参阅 打包和分发项目。
生成分发档案
下一步是为 包 生成分发包。这些是上传到包索引的档案,可以通过 pip 安装。
确保您拥有 setuptools
并 wheel
安装了最新版本:
1 | python3 -m pip install --user --upgrade setuptools wheel # 不在虚拟环境时 |
小提示
如果您在安装它们时遇到问题,请参阅 安装包 教程。
现在从 setup.py
位于的同一目录运行此命令:
1 | python3 setup.py sdist bdist_wheel |
此命令应输出大量文本,一旦完成,应在 dist
目录中生成两个文件:
1 | dist |
注意
如果您遇到麻烦,请复制输出并提出有关 包装问题的问题,我们会尽力为您提供帮助!
该 tar.gz
文件是 源存档, 而该 .whl
文件是 构建的分发。较新的 pip 版本优先安装构建的发行版,但如果需要,将回退到源代码存档。您应该始终上传源存档并为项目兼容的平台提供构建的存档。在这种情况下,我们的示例包在任何平台上都与 Python 兼容,因此只需要一个构建的发行版。
上传分发档案
最后,是时候将您的包上传到 Python Package Index 了!
您需要做的第一件事是在 Test PyPI 上注册一个帐户。Test PyPI 是用于测试和实验的包索引的单独实例。这对于像我们不一定想要上传到真实索引的本教程这样的东西很棒。要注册帐户,请访问 https://test.pypi.org/account/register/ 并完成该页面上的步骤。在您上传任何套餐之前,您还需要验证您的电子邮件地址。有关 Test PyPI 的更多详细信息,请参阅 使用 TestPyPI。
现在您已注册,您可以使用 twine 上传分发包。你需要安装 Twine:
1 | python3 -m pip install --user --upgrade twine |
安装完成后,运行 Twine 以上传所有存档 dist
:
1 | python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* |
系统将提示您输入使用 Test PyPI 注册的用户名和密码。
1 | python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* |
错误的用户验证信息,你需要创建一个用户验证文件 ~/.pypirc
。
1 | [distutils] |
使用 twine upload dist/*
上传。
1 | twine upload dist/* |
可能有重名了,我改一下。
1 | name="slm" |
改为
1 | name="slmethod", |
再试一次。
1 | python3 setup.py sdist bdist_wheel |
命令完成后,您应该看到与此类似的输出:
1 | Uploading distributions to https://upload.pypi.org/legacy/ |
上传后,您的软件包应该可以在 TestPyPI 上查看,例如,https://pypi.org/project/slmethod/
安装新上传的软件包
1 | pip install slmethod |
或者
1 | python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps slmethod |
1 | Collecting slmethod |
确保在包名中指定您的用户名!
pip 应该从 Test PyPI 安装包,输出应该如下所示:
1 | python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps slmethod |
注意
此示例使用 --index-url
flag 指定 TestPyPI 而不是实时 PyPI。另外,它指定 --no-deps
。由于 TestPyPI 与实时 PyPI 没有相同的包,因此尝试安装依赖项可能会失败或安装意外的事情。虽然我们的示例包没有任何依赖关系,但在使用 TestPyPI 时避免安装依赖项是一种很好的做法。
您可以通过导入模块并引用先前 name
放置的属性来测试它是否已正确安装 __init__.py
。
运行 Python 解释器(确保你仍然在你的 virtualenv 中):
1 | python |
然后导入模块并打印出 name
属性。这应该是一样的,不管你的名字你给您的 分发包 中 setup.py
(在这种情况下,slm
),因为你的导入包 是 slm
。
1 | import slmethod |
后续步骤
恭喜,您已经打包并分发了一个 Python 项目! ✨🍰✨
请记住,本教程向您展示了如何将程序包上传到 Test PyPI,它不是永久存储。测试系统偶尔会删除软件包和帐户。最好使用 Test PyPI 进行测试和实验,如本教程。
当您准备将真实包上传到 Python 包索引时,您可以像在本教程中那样执行相同操作,但具有以下重要差异:
- 为您的包装选择一个令人难忘的独特名称。您不必像在教程中那样附加用户名。
- 在 https://pypi.org 上注册一个帐户 - 请注意,这些是两个独立的服务器,并且测试服务器的登录详细信息不与主服务器共享。
- 使用上传你的包,并输入您的凭据为你真正的 PyPI 注册的账号。
twine upload dist/*
- 使用真正的 PyPI 安装包。
pip install [your-package]
在这一点上,如果你想阅读更多关于包装的 Python 库,你可以做以下事情:
- 阅读有关使用 setuptools 在打包和分发项目中打包库的 更多信息。
- 阅读 包装二进制扩展。
- 考虑诸如 flit,hatch 和poetry 之类的setuptools 的替代方案。