如何发布自己的包到 pypi ?
使用 pip 安装自己写的 Python 程序,想想就很酷对不对?!
除了很酷之外,其他程序员也能安装你的包,快速的处理一些事情。这就相当于你把自己的工作分享出来,四舍五入等于造福了全人类啊!
如果同时你把代码开源在 Github 上,别人在使用后也许会给你一些反馈,还有一部分人可能直接帮你把 BUG 改了,这样对你的好处也是极大的!
1 PyPI 简介
我们经常使用 pip 安装或者更新一些包,那这些包是保存在哪里的呢?
如果是一个服务器,我们是不是把自己的包丢到这个服务器里,然后就可以使用 pip 安装了呢?
没错!大致的原理就是如此,而这个服务器叫 pypi.org。
先来看下网站是如何介绍自己的:
The Python Package Index (PyPI) is a repository of software for the python programming language.
翻译一下:PyPI 是 Python 编程语言的软件存储库。
接下来我们一起把自己的程序(包)example_pkg
托管到 PyPI,从而实现便捷的安装和更新。
2 快速上手
1 编写 setup.py
你需要在上传的目录/example_pkg
下面建立一个名为setup.py
的文件,它是构建工具setuptools
的构建脚本,里面主要是一些配置信息,需要你提供包的名称、版本以及包含的代码等等。
1 | /example_pkg |
下面👇是一个样例,你可以根据实际情况去修改它。
1 | import setuptools |
long_description 是在关于你项目的介绍,所以你最好创建一个 README.md 文件,然后使用 Markdown 语言编写介绍。
2 检查文件
在/example_pkg
目录下,输入下面👇命令进行检查:
1 | python setup.py check |
如果输出任何异常信息,那么说明 setup.py 和上传的包没有问题。
3 注册账户
在/example_pkg
目录下,输入下面👇命令注册包:
1 | python setup.py register |
如果你先前没有账号,可以选择去 pypi.org 注册一个,或者直接在命令行里进行注册。
1 | 1. use your existing login, |
- 输入 1 使用已有账户;
- 输入 2 直接进行注册;
- 输入 3 通过邮件重制密码;
- 输入 4 退出。
当你输入账号密码后,会在$HOME
目录下面生成.pypirc
配置文件,里面存储着仓库链接、账号密码等。下次使用时它会自动读取配置文件,省去写入了账号密码的步骤。
下面👇是我的.pypirc
配置(隐去了密码):
1 | [distutils] |
4 打包文件
在/example_pkg
目录下,输入下面👇进行打包:
1 | 支持 pip 安装的打包方式 |
推荐使用第1种可以支持 pip 安装的打包方式,比较常用。
5 上传文件
在/example_pkg
目录下,输入下面👇进行上传:
1 | python setup.py upload |
6 查看
在 pypi.org 上搜索你的项目名,看到自己的包是不是有些欣喜😄呢!
7 安装
如何安装自己的上传的包呢?这就很简单啦!
1 | pip install $your_package |
⚠️ 注意!这里可能会遇到一个错误:
1 | Could not find a version that satisfies the requirement cnnlp (from versions: ) |
这个问题可能是以下两种情况造成的:
第一种是我们的包刚刚上传,由于网络延时等各种原因,暂时无法找到包。这种情况的解决方法很简单,就是等一会儿再安装。
还有一种情况是 pip 的安装源被修改了。比如替换成了清华源
、豆瓣源
等等,这些第三方源一段时间才会同步一次所有的包,所以暂时无法找到你刚上传的包。解决方法是在安装时指定成默认的pypi源
:
1 | pip install $your_package -i https://pypi.org/simple |
对于包文件,我们还有另外一种方法安装,直接通过源文件安装。
比如你可以直接在 PyPI 的项目介绍里找到给出 Github 仓库地址,然后克隆代码。在代码的主目录下直接运行下面的命令进行安装:
1 | python setup.py install |
如果能顺利安装,那么恭喜你🎉
3 使用模版
利用模版可以快速的生成一个 Python Package 所需要的所有文件,我根据常用的功能制作了 Python-package-template,现在已经开源在了 GitHub 上,点击这里直达。
4 参考链接
如何发布自己的包到 pypi ?