当我们完成Python项目后,如何将该项目发布到PyPi上呢?下面将介绍如何使用setuptools等工具来实现包编译及上传。
以下教程皆参考自Packaging Python Projects — Python Packaging User Guide
项目结构
我们的项目结构如下所示:
其中src
为我们包源码所在的位置,examples
为我们示例代码所在的位置,tests
为测试代码所在的位置,其他目录均为生成目录,无需手动生成。
src
底下包括我们的eventbus
包,注意包的定义是目录下有__init__.py
文件。我们在使用时也是导入的src
中的包,例如包名为eventbus
则会使用import eventbus
导入,导入包名和eventbus
项目名eventbus-py
可以不同。
使用纯净的Python环境来检查项目依赖
一般我们需创建一个全新环境来进行开发,同时为了检查我们的包所需要的依赖项,建议该环境仅用于本项目。常见的虚拟环境搭建我们可以使用conda
、virtualenv
等来进行创建。我们可以使用pip freeze > requirements.txt
来将依赖生成到requirements.txt
文件中,以备使用。
编写pyproject.toml
pyproject.toml
告诉编译工具你将使用什么配置进行编译,官方给的配置如下:
|
|
我们参考该配置编写本项目的pyproject.toml
配置元数据
官方推荐使用静态元数据配置文件setup.cfg
来进行配置,对于一些场景可以使用动态元数据配置文件setup.py
进行配置。这里为了一步到位,我们使用动态配置setup.py
|
|
注意我们有一个README.md
文件来描述我们的项目,这里直接引入。
下面参数中,name
参数比较重要,这个就是我们上传到PyPi后的项目名,我们可以通过pip install {name}
来下载该包。
package_dir
参数是包名和目录的映射。空包名代表“根包”——项目中包含包的所有 Python 源文件的目录——因此在这种情况下,src 目录被指定为根包。
packages
参数是所有应该包含在发行包中的 Python 导入包的列表。我们可以使用 find_packages() 来自动发现package_dir
下的所有包和子包,而不是手动列出每个包。在这种情况下,包的列表将是 eventbus
,因为那是唯一存在的包。
python_requires
提供了你的项目所支持的 Python 版本。像 pip 这样的安装程序会回顾旧版本的软件包,直到找到一个与 Python 版本相匹配的软件包。
编译whl文件
下载build
工具
pip install --upgrade build
进行编译
python -m build
此时会生成dist
目录和build
目录,如果不上传到PyPi的话,可以直接将dist
目录下的.whl
文件安装到其他环境中使用(pip install eventbus.whl
)。
配置PyPI账户
首先注册Create an account · TestPyPI或Create an account · PyPI。前者是测试环境,后者是生产环境。注册后我们需要创建文件来为后续上传做准备。
|
|
可以将该文件保存为.pypirc
。推荐路径为$HOME/.pypirc
上传到PyPi
安装twine
|
|
使用twine
上传到对应源
|
|
可以看到这里我们使用testpypi源,并且没有指定.pypirc
,所以如果没有$HOME/.pypirc
的话,会以交互方式让你输入用户名密码后再上传。
也可以指定配置文件:
|
|
当上传到生产环境时,去掉repository
参数。
|
|