发布自己的Python包(Pypi)
我们经常使用 Pypi 来安装包,但是有时候我们也想要发布自己的 Pypi 包,有可能我们写了一个特别牛的包,也有可能我们只是想使用自己常用的一些轮子,可能这是我们日常编码中很常用的一些轮子,我们在不同工程目录、不同设备上都会频繁使用的一些接口,可能我们自己对这些自己常用的接口很熟悉,但是却因为环境的迁移而需要重复地实现,这时我们就可以发布一个自己的 Pypi 包,在环境迁移时使用熟悉的轮子只需要 pip install ***
即可。
就算这些轮子我们可能实现的没有那么完美,”不足为外人道也“,但却是我们最熟悉的,接口早已了然于心,因此这样使用起来会很方便。
发布
注册Pypi账号
没什么好多说的,出奇的简单,不需要任何多余的东西,邮箱、用户名、密码即可。链接如下:
https://pypi.org/
开发自己的包
假设我想发布一个包,里面有我们常用的一些使用函数,包名称为 SongUtils
,我们先完成功能的开发,都在 SongUtils
目录下,得到目录结构如下:
├── SongUtils
│ ├── AVAUtils.py
│ ├── ImgUtils.py
│ ├── MetricUtils.py
│ ├── README.md
│ └── __init__.py
__init__
文件是必须的,这是一个package的象征,可以什么都不写,但必须有。
准备setup.py
setup.py
是构建我们的Python包的关键,它的位置与我们的整个工程目录同级,包含了我们这个包的一些关键信息和依赖等,简单的可以参考下面笔者第一次发布包时的 setup.py
文件内容,其中各项看其名称即可一目了然,更详细的各项参数的含义网上其他博客也有介绍,在此不再赘述:
#!/usr/bin/env python
#-*- coding:utf-8 -*-from setuptools import setup, find_packages #这个包没有的可以pip一下setup(name = "SongUtils", #这里是pip项目发布的名称version = "0.0.1", #版本号,数值大的会优先被pipkeywords = ["pip", "SongUtils"], # 关键字description = "Junjie's private utils.", # 描述long_description = "Junjie's private utils.",license = "MIT Licence", # 许可证url = "https://github.com/Adenialzz/SongUtils", #项目相关文件地址,一般是github项目地址即可author = "Adenialzz", # 作者author_email = "********@***.com",packages = find_packages(),include_package_data = True,platforms = "any",install_requires = ["numpy", "pillow"] #这个项目依赖的第三方库
)
本地打包
完成 setup.py
文件后,我们的目录树如下:
├── SongUtils
│ ├── AVAUtils.py
│ ├── ImgUtils.py
│ ├── MetricUtils.py
│ ├── README.md
│ └── __init__.py
└── setup.py
然后在 setup.py
所在目录下,我们运行它来将项目本地打包:
python setup.py sdist
没有问题的话,在打包之后我们会得到如下目录树:
├── SongUtils
│ ├── AVAUtils.py
│ ├── ImgUtils.py
│ ├── MetricUtils.py
│ ├── README.md
│ └── __init__.py
├── SongUtils.egg-info
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ ├── dependency_links.txt
│ ├── requires.txt
│ └── top_level.txt
├── dist
│ └── SongUtils-0.0.1.tar.gz
└── setup.py
上传到Pypi服务器
首先在setup.py这一级的目录下建立一个系统文件 .pypirc
内容如下:
[distutils]
index-servers = pypi[pypi]
username:你的PyPi用户名
password:你的PyPi密码
这里的用户名密码,就是我们第一步注册时的账号。
然后安装一个上传的工具来上传即可:
pip install twine
twine upload dist/SongUtils-0.0.1.tar.gz
验证
至此我们整个Python包的发布过程就已经完成了,我们可以(在其他机器)安装来验证一下:
pip install SongUtils
然后准备一个测试文件:
# test.py
import SongUtils# Call you functions to evaluate.
在测试文件中调用自己包中的函数,看测试是否正常工作:
python test.py
删除
如果你想删除自己的 Pypi 包,只需要登陆到自己的 Pypi 网站的账户,并进入到自己想要删除的项目,然后选择对应版本,点击 Optins -> Delete 即可,过程中会要求你输入删除的版本号来防止误删除,在删除后也会给你的邮箱发送邮件提醒。
但是,这不是一个好主意,因为前一个软件包的所有用户都会看到他们的安装失败。
如果要弃用程序包,可以执行的操作是使用指向新程序包的README发布最后一个发行版。有人为python-cli-ui做了那个,它被替换为cli-ui
你也可以:
setup.py
运行时添加警告- 或在导入时
- 或者用一个取决于新名称的虚拟包替换包。
说明
这个过程只是一个简单的 Python 包的发布过程,在过程中其实有许多需要注意的地方,比如 setup.py 文件应当写的更加规范,整个包内的代码也应当更加规范,应当有一个比较好的 Description 或者 README.md 文档等等。这就留在以后有机会再说吧。
扩展阅读:
python打包发布pypi踩坑记(最新贴心版本,认真对待自己的库)
Ref:
https://www.cnblogs.com/suoyike1001/p/15216699.html
https://cloud.tencent.com/developer/ask/208868