User:Xyy23330121/Python/发布自己的模块
读者可能会想要分享自己编写的模块。在安装第三方模块时,pip 在 PyPI(The Python Package Index) 上查询读者给出的模块名,从而安装了对应的第三方模块。若读者想要发布自己编写的模块,也应该把模块发布到 PyPI 上面去。
本页面将讲解如何发布自己的模块。
发布 Python 模块的方法有很多种,可以参阅相关的 文档。这里只讲解一种。
一个待发布的模块,一般具有以下的文件结构:
MyPackge/ #随便一个文件夹
LICENSE.txt #授权协议信息
README.md #说明信息。
pyproject.toml #安装时的配置
src/ #模块内容
MyModule/ #模块名
__init__.py
...
可以看到,除了模块内容之外,还需要三个文件。LICENSE.txt 和 README.md 很好理解,以下主要讲解 pyproject.toml 的内容。
pyproject.toml 会包含安装本模块时所需的配置信息。为简便起见,这里直接将一个完整的示例放在下方:
#toml 在许多方面有类似 Python 的语法,比如注释前面也需要井号。
[build-system]
#安装模块时所使用的安装方式
#这里以使用 setuptools 包所提供的安装方式,来安装自定义模块为例。
#其它安装方式,参见 https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#declaring-the-build-backend
#setuptools 参见:https://pypi.org/project/setuptools/
#需要 >= 61.0 版本的 setuptools
requires = ["setuptools >= 61.0"]
build-backend = "setuptools.build_meta"
[project]
#模块的基本信息
#模块名称、版本、说明、readme文件位置
name = "MyModule"
version = "0.0.1"
description = "这是一个测试模块"
readme = "README.md"
#授权协议
license = {file = "LICENSE.txt"}
#也可以使用协议名称的方式来确认授权协议。
#license = {text = "MIT License"}
#关键词列表
#当其他人在PyPI搜索以下关键词时,PyPI会把你的模块加入到搜索结果中。
keywords = ["关键词1", "关键词2", "关键词3", "关键词4", "关键词5"]
#分类列表
#方便其它人在PyPI按分类筛选模板
#浏览 https://pypi.org/classifiers/ 以获取更多可能的分类,以下是分类示例
classifiers = [
"Development Status :: 3 - Alpha",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3.12"
]
#作者列表和维护者列表
#一般要包含人名和电子邮箱地址。但也可以只包含人名,或者只包含电子邮箱地址。
authors = [
{name = "作者1", email = "author1@example.com"},
{name = "作者2", email = "author2@example.com"},
{name = "作者3"},
{email = "author4@example.com"},
]
maintainers = [
{name = "维护者1", email = "maintainer1@example.com"}
]
#环境需求(可选)
#有的模块中可能会 import 来自其它模块的内容。这里要列出本模块所 import 的、并非 Python 内置模块的模块。
#如果不需要任何额外模块,可以不包含此项。
dependencies = [
"numpy",
"gidgethub[httpx]>4.0.0",
"django>2.1; os_name != 'nt'",
"django>2.0; os_name == 'nt'",
]
#所需的 Python 版本
requires-python = ">= 3.8"
[project.optional-dependencies]
#可选的环境需求(可选)
#如果在安装时使用了对应的选项,则会额外安装以下的模块。
#pip install MyModule[gui] 时,会额外安装的模块。
gui = ["tkinter"]
#pip install MyModule[cli] 时,会额外安装的模块。
cli = [
"click",
]
[project.urls]
#模块相关的网页。(可选)
Homepage = "https://模块主页.com"
Documentation = "https://模块文档.readthedocs.org"
Repository = "https://github.com/exampleauthor/examplemodule.git"
Issues = "https://github.com/exampleauthor/examplemodule/issues"
Changelog = "https://github.com/exampleauthor/examplemodule/blob/master/CHANGELOG.md"
[project.scripts]
#当安装模块时,会注册的命令。(可选)
#以下内容代表:
# 在比如 cmd.exe 的程序中,执行 "runMyModule" 指令时,会在前台执行以下 python 代码:
# from MyModule import 指令名
# 指令名()
runMyModule = "MyModule:指令名"
[project.gui-scripts]
#当安装模块时,会注册的命令。(可选)
#如果是 Windows 系统,以下内容代表:
# 在比如 cmd.exe 的程序中,执行 "runMyModule" 指令时,会在后台执行以下 python 代码:
# from MyModule import 指令名2
# 指令名2()
#如果是其它系统,以下项目和 project.scripts 中的项目没区别。
run_module_gui = "MyModule:指令名2"
[project.entry-points."模块B.指令A"]
#本模块可以作为其它模块的插件
#如果安装本模块,在执行“模块B”中的“指令A”时,会替换为执行“MyModule”中的“指令名3”
excl = "MyModule:指令名3"
#更多使用方式,参见:
# 作为插件使用 https://setuptools.pypa.io/en/latest/userguide/entry_point.html#entry-points-for-plugins
# importlib 模块的文档
除使用 pyproject.toml
之外,还可以使用 setup.py
或 setup.cfg
来存储模块的安装配置。参见:
当前不建议使用 setup.py 或 setup.cfg 来存储安装配置。
要打包模块,需要运行以下命令:
pip install --upgrade build
然后用类似以下指令的方式,移动到模块文件夹下:
cd "MyPackage"
然后再执行以下指令:
python -m build
这些指令完成后,会生成类似以下的文件:
MyPackge/
dist/
example_package-0.0.1-py3-none-any.whl
example_package-0.0.1.tar.gz
在把模块上传到 PyPI 前,还需要对模块进行最后一步测试:将模块上传到 TestPyPI。
为了模块的安全,使得恶意用户不可以私自改动读者在 PyPI 上分享的内容,读者将需要一个 token。读者应该遵循以下的步骤:
- 在 https://test.pypi.org/account/register/ 中注册一个账户。
- 在 https://test.pypi.org/manage/account/#api-tokens 中创建一个 token 并保存它。
除了 token 第一次生成时,读者无法在网页中查到已生成的 token。除非读者已经把 token 保存到本地,请不要关闭本步骤所打开的网页。
读者可以使用 twine 模块来上传自己的模块。先安装 twine 模块:
pip install --upgrade twine
然后用类似以下指令的方式,移动到模块文件夹下:
cd "MyPackage"
然后再执行以下指令:
py -m twine upload --repository testpypi dist/*
将上传的模块安装到电脑上:
pip install --index-url https://test.pypi.org/simple/ --no-deps MyModule
然后进行测试即可。
正式上传的步骤和测试的步骤类似。首先生成 token:
- 在 https://pypi.org/account/register/ 中注册一个账户。
- 在 https://pypi.org/manage/account/#api-tokens 中创建一个 token 并保存它。
然后用以下指令进行上传即可:
py -m twine upload dist/*
如果希望其他人使用自己的模块,读者应当给自己的模块编写一份文档。这个文档应该包含以下内容:
- 安装方式 Installation
包含各种系统应该如何安装此模块。一般情况下,仅包含一句pip install ModuleName
。如果有可选项,还会包含pip install ModuleName[Option]
等。 - 快速入门 Quick Start
包含导入模块,并使用模块的一个基本功能的方法。 - 用户指南 User Guide
包含使用模块更多功能的方法。 - 开发者指南 Developer Guide
包含参与该模块编写开发时的要点。 - API 参考 API Reference
包含模块中一切函数、变量、类、类的方法、类的属性等的具体信息。
发布文档的常用方法是:
- 使用 github 博客页,或者在 github 中用 Markdown 文件的方式编写文档。
- 发布到 readthedocs.io。
- 自己建立一个网站,在网站上发布文档。