python打包与发布

本文记录关于python打包并发布到PyPI上的步骤与过程中的注意点.

创建包

创建项目文件夹

新建一个文件夹, 如pypi-release, 这是项目文件夹, 只起到一个收纳的作用, 所有与包相关的内容我们接下来都会放到该文件夹下.

包相关内容

在项目文件夹中, 我们新建一个文件夹, 如test_release, 这是包文件夹, 文件夹名就是你要用的包名了.

然后在包文件夹下新建一个__init__.py文件, 它的作用是让这个文件夹变为一个python模块, 接下来, 我们的逻辑代码就可以直接写在里面了, 如果你的代码逻辑比较复杂, 你也可以新建其他的py文件(如functions.py), 将代码归纳, 再到__init__.py文件中引入、整理.

如我在functions.py文件中写入如下内容

def print_function():
    print("this is functions.py")

__init__.py文件中写入如下内容

from .functions import *

def use_functions():
    print_function()

然后我们在项目文件夹下新建一个setup.py文件, 这是项目配置文件, 可以参考如下内容

from setuptools import setup, find_packages

NAME = "项目名"
VERSION = "版本号"
DESCRIPTION = "项目描述"
LONG_DESCRIPTION="项目长描述"
KEYWORDS=("关键词")
LICENSE="许可证"
AUTHOR = "作者"
AUTHOR_EMAIL = "作者邮箱"
URL = "项目地址"
PLATFORMS=["使用平台"]
INSTALL_REQUIRES=["项目依赖"]

setup(
    name=NAME,
    version=VERSION,
    keywords=KEYWORDS,
    description=DESCRIPTION,
    long_description="LONG_DESCRIPTION,
    license=LICENSE,

    url=URL,
    author=AUTHOR,
    author_email=AUTHOR_EMAIL,

    packages=find_packages(),
    include_package_data=True,
    platforms=PLATFORMS,
    install_requires=INSTALL_REQUIRES
)

现在整个项目的文件目录索引如下 👇

pypi/
├── test_release
│   ├── functions.py
│   └── __init__.py
└── setup.py

我们现在可以使用命令python setup.py install即可将该项目作为一个包安装, 安装结束后我们进入python的REPL环境, 进行如下操作

>>> import test_release
>>> test_release.use_functions()
this is functions.py
>>> functions()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'functions' is not defined
>>> from test_release import functions
>>> print_function()
this is functions.py
>>>

相信到这你对整个包的结构以及其在python中作为模块时是怎样起作用的应该有所了解了.

打包与发布

创建账号

PyPI官网上创建一个账号.

账户信息配置文件

我们在自己的用户家目录下创建文件.pypirc, 写入如下内容 👇

[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username = 你的用户名
password = 你的密码

打包

这时我们在项目目录下使用命令python setup.py bdist_wheel打包, 运行结束后, 即可进行下一步, 发布到pypi上.

至于命令python setup.py bdist_wheel中的bdist_wheel只是一种打包方式, 还有其他的很多方式, 如sdist, bdist, bdist_rpm等, 以及setuptools的很多高级使用方法, 读者可以自己去查文档等, 在此不多加赘述.

发布

这里使用twine帮助我们进行发布:

先使用pip install twine命令安装twine, 然后在已经打包过的项目文件夹下使用命令twine upload dist/*将包发布到PyPI, 完成后到自己的账户下即可查看到刚刚上传的项目.

赘述

注: 如果发布包的时候遇到HTTPError: 400 Client Error: This filename has previously been used, you should use a different version.类似的错误描述, 这是因为PyPI自身的机制, 文件名不可重用, 可以参见官方文档file-name-reuse, 其实可以使用一些方法绕过, 如在打包命令后加上--format=zip, gztar等来指定打包后的文件格式, 这样文件名(后缀)就变了, 即可上传, 其他方法请自行查阅.