发布自己开发的 python 包到 pypi

发布自己开发的 python 包到 pypi

1 pypi 介绍

Python中我们经常会用到第三方的包,默认情况下,用到的第三方工具包基本都是从Pypi.org里面下载。那我们如何将自己开发的一个包上传到PyPI,供其它人使用呢。
官方地址:pypi.org

2 自己开发python包并发布

下面就开始介绍如何将自己的Python项目发布到PyPI

2.1 创建目录结构

创建一个测试项目,例如project_demo,在该项目下,创建一个待发布的包目录,例如: log_config(这个名字建议慎重,建议和未来发布的包名一致),并在该project_demo目录下,依次创建:setup.pyLICENSEREADME.rst几项文件,此时目录结构为:
➜ project_demo
.
├── LICENSE
├── README.rst
├── log_config
│ └── init.py
└── setup.py

2.2 准备必要文件

接下来我们来逐一编写除了代码以外的文件。

1、README.rst

项目的描述文件,一般包含怎样安装项目,怎样使用项目等。这个文件最终将被渲染到pypi网站本库的首页,是门户。相当于 github 工程的 readme.md。 如果对 rst 语法不熟悉的同学,我的建议是写一个 markdown 语法的readme.md 介绍文件(github 上可以复用),写完之后,找个工具把 readme.md 转换成 readme.rst 即可。
推荐个在线工具:MD to RST | CloudConvert

2. LICENSE.txt,创建许可证

上传到Python Package Index的每个包都包含许可证,这一点很重要。这告诉用户安装你的软件包可以使用您的软件包的条款。开源License,有如MIT,Apache license 2.0等。有关选择许可证的帮助,请访问[https://choosealicense.com/](https://choosealicense.com/)。选择许可证后,打开 LICENSE并输入许可证文本。

3 setup.py文件

setup.py是setuptools的构建脚本,用来描述项目,打包的时候会用到这个文件。它告诉PyPI我们的项目叫什么名字,是什么版本,依赖哪些库,支持哪些操作系统,可以在哪些版本的Python上运行,等等。
以我自己的 log-congfig库举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python  
# -*- coding: utf-8 -*-
# Created by Charles on 2018/6/20
# Function: setup log_config

from setuptools import setup, find_packages

setup(
name='log_config',
version="2.1.1",
description=(
"Provide a function for anyone who want to configure log parameters easily, just call init_log_config when your app start up, the you can use the module of logging which build-in python3 without any other configture. This module support TimeRotatingHandler, MultiProcessTimeRotatingHandler, RotatingFileHandler and SMTPHandler and You can change the configuration parameters according to your requirements."
),
long_description=open('README.rst').read(),
author='Wu Charles',
author_email='wcadaydayup@163.com',
maintainer='Wu Charles',
maintainer_email='wcadaydayup@163.com',
license='BSD License',
packages=find_packages(),
platforms=["all"],
url='https://github.com/amazingcoderpro/log_config/',
classifiers=[
'Development Status :: 5 - Production/Stable',
'Operating System :: OS Independent',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Programming Language :: Python',
'Programming Language :: Python :: Implementation',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Topic :: Software Development :: Libraries'
],
)

重要参数说明:

  • name:项目的名称,name是包的分发名称。
  • version:项目的版本。需要注意的是,PyPI上只允许一个版本存在,如果后续代码有了任何更改,再次上传需要增加版本号
  • author和author_email:项目作者的名字和邮件, 用于识别包的作者。
  • description:项目的简短描述
  • long_description:项目的详细描述,会显示在PyPI的项目描述页面。必须是rst(reStructuredText) 格式的
  • packages:指定最终发布的包中要包含的packages。
  • install_requires:项目依赖哪些库,这些库会在pip install的时候自动安装
  • classifiers:其他信息,一般包括项目支持的Python版本,License,支持的操作系统。

参数比较多,手写比较麻烦,一般copy成熟的模板后按照自己的实际情况修改即可。

2.3 编写核心逻辑代码

接下来我们就可以编写自己的代码了,要注意源代码文件夹(仓库里的log_config包目录)的名字与setup.py里配置的包名(Name)要一致。这一部内容,就根据各自的需求,自行实现即可。
例如我写的 log-config, 大家可以参考:log_config_src

2.4生成分发档案

下一步是为包生成分发包。这些是上传到包索引的档案,可以通过pip安装。

确保您拥有setuptools、wheel 且安装了最新版本:

1
python3 -m pip install --user --upgrade setuptools wheel

生成这前,可以先在工程目录下运行python setup.py check检查setup.py是否有错误,如果没报错误,则进行下一步输出一般是running check。

1、准备好上面的步骤, 一个包就基本完整了, 剩下的就是打包了,可以使用下面命令打包一个源代码的包:

1
python setup.py sdist build

这样在当前目录的dist文件夹下, 就会多出一个tar.gz结尾的包了:

2、也可以打包一个wheels格式的包, 使用下面的命令就可以了:

1
python setup.py bdist_wheel --universal

这样会在dist文件夹下面生成一个whl文件.

3、或者从setup.py位于的同一目录运行此命令:

1
python3 setup.py sdist bdist_wheel

上面的命令会在dist目录下生成一个tar.gz的源码包和一个.whl的Wheel包。

2.5 发布包到PyPi

1、接下来就是去 pypi.org`注册账号,如果有账号的请忽略,记住你的账号和密码,后面上传包会使用。

2、接下来就是上传你的包了,这里使用twine上传。需要先安装twine(用 twine上传分发包,并且只有 twine> = 1.11.0 才能将元数据正确发送到 Pypi上)

1
pip install twine

3、安装完之后,运行下面的命令将库上传,上传包,期间会让你输入注册的用户名和密码

1
twine upload dist/*

输入 PyPI注册的用户名和密码。命令完成后,您应该看到与此类似的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ twine upload dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Uploading log_config-2.1.0-py2.py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 25.7/25.7 kB • 00:01 • 47.0 MB/s
Uploading log_config-2.1.1-py2.py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 25.5/25.5 kB • 00:00 • 40.1 MB/s
Uploading log_config-2.1.1-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 25.5/25.5 kB • 00:00 • 42.6 MB/s
Uploading log_config-2.1.0.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 25.1/25.1 kB • 00:00 • 24.2 MB/s
Uploading log_config-2.1.1.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24.9/24.9 kB • 00:00 • 27.2 MB/s

上传完成后,我们的项目就成功地发布到PyPI了。

最新上传是时官方推荐的不在是用户名和密码登录,而是使用 API TOKEN

可以到 pypi 个人主要的账户页面申请 api token

建议保存 api token 到~/.pypirc 文件中, 以后发布时就不用手动输入了。

3 验证发布 Pypi是否成功

上传完成了会显示success,我们直接可以在PyPI上查看,如下:

4. 验证pip install 是否正常

执行pip install log-config, 并验证逻辑功能是否 ok.

5. 后续更新

python 包发布以后,未来可能还会继续改进迭代,这时就需要重新发布更新。步骤比较简单:

  • 1 更新核心逻辑代码
    1. 更新 readme.rst 描述更新的部分
    1. 更新 setup.py 更新版本号等信息
    1. 重新执行2.4及之后的步骤。
作者

Amazing Coder

发布于

2024-11-14

更新于

2024-11-14

许可协议

评论