发布你自己的轮子 - PyPI打包上传实践

本文仅讨论上传相关的步骤,关于如何给写一个setup.py 请参阅官方文档:

上传前的注意事项

  • 假设你的包已经开发完成,并且根目录必须要有一个setup.py
  • 最好有一个README.rst 用来描述你的轮子,虽然这不是必须的,但文档就像内裤,你最好还是要有的。
  • 如果你需要打包代码文件夹以外的文件,比如版权信息等等,你还需要写一个 MANIFEST.in

关于setup.py的补充说明

  • name 必须是唯一的,允许使用数字和字母,推荐使用中划线(-)而不是下划线(_),因为pip安装只支持中划线,比如pip install my-pkg,为了不给自己找麻烦请听话。
  • version推荐遵循语义化版本号规则,简单说就像这样:1.2.0
  • 作者姓名和邮箱地址不一定要和你的PyPI账号一致。

测试本地打包命令

如果上面的都没问题,在本地目录执行以下命令应该能成功在dist目录下生成*.tar.gz的包文件。

python setup.py sdist

上传并发布包文件到PyPI

创建 PyPI账号

非常简单,直接通过官网注册 https://pypi.python.org/pypi?..., 但是需要验证邮件并确认激活。

创建用户验证文件 ~/.pypirc

在自己的用户目录下新建一个空白文件命名为.pypirc,内容如下:

[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username = <username>
password = <password>

用户名和密码就是上一步骤所创建的,直接明文输入。如果你觉得明文密码不安全也可以留空,在后面的上传过程中会提示你手动输入。

注册你的包

你需要到PyPI注册并验证你的包,之后才能开始真正上传,注册的方式有以下几种。

  1. 使用命令python setup.py register,最简单但官网不推荐,因为使用的是HTTP未加密,有可能会被攻击人嗅探到你的密码。
  2. 通过PyPI网站提交表单完成注册验证。
  3. 安装 pip install twine 然后在通过命令 twine register dist/mypkg.whl 完成注册。

上传并完成发布

你可以任选以下两种方式之一发布你的轮子。

  1. 使用命令:python setup.py sdist upload,还是和上面一样,简单但有安全隐患,目前已淘汰
  2. 使用 twinetwine upload dist/*

管理你的包

如果你的包已经上传成功,那么当你登录PyPI网站后应该能在右侧导航栏看到管理入口。

pypi_manage

点击包名进去后你可以对你的包进行管理,当然你也可以从这里删除这个包。

让别人使用你的包

包发布完成后,其他人只需要使用pip就可以安装你的包文件。比如:

pip install package-name

如果你更新了包,别人可以可以通过--update参数来更新:

pip install package-name --update

可能遇到的错误

Upload failed (403): Invalid or non-existent authentication information.

错误的用户验证信息,你需要创建一个用户验证文件 ~/.pypirc。请参阅上文。

Upload failed (403): You are not allowed to edit 'xxx' package information

你需要先注册你的包才可以开始上传,运行注册命令:python setup.py register

Server response (401): Incomplete registration; check your email

你的PyPI账户还没完成邮箱验证,你需要去注册邮箱找到一封验证邮件完成验证后再重试失败的步骤。

Server response (400): Invalid classifier "Topic :: Software Development :: Utilities"

你的setup.py文件中的classifier信息有误,请按官网的正确分类书写classifier.

error: No dist file created in earlier command

你还没打包就开始了上传命令,建议打包和上传的操作放在一起做,比如:

python setup sdist upload

error: Upload failed (499): Client Disconnected

这应该是网络问题,多重试几次。

Upload failed (400): File already exists

文件已经存在了,你每一次上次都应该更新版本号。

参考文档

关于作者:Python技术爱好者,目前从事测试开发相关工作,转载请注明原文出处。

欢迎关注我的博客 https://betacat.online,你可以到我的公众号中去当吃瓜群众。

Betacat.online


Python测试开发
边测试边开发,边当群众边吃瓜。

未上线的猫。

1.4k 声望
130 粉丝
0 条评论
推荐阅读
使用timeit测试Python函数的性能
timeit是Python标准库内置的小工具,可以快速测试小段代码的性能。认识timeittimeit 函数: {代码...} 参数说明:stmt: statement的缩写,你要测试的代码或者语句,纯文本,默认值是 "pass"setup: 在运行stmt前的...

betacat阅读 2k

日常Python 代码片段整理
1、简单的 HTTP Web 服务器 {代码...} 2、单行循环List {代码...} 3、更新字典 {代码...} 4、拆分多行字符串 {代码...} 5、跟踪列表中元素的频率 {代码...} 6、不使用 Pandas 读取 CSV 文件 {代码...} 7、将列表...

墨城2阅读 278

Unicode 正则表达式(qbit)
前言本文根据《精通正则表达式》和 Unicode Regular Expressions 整理。本文的示例默认以 Python3 为实现语言,用到 Python3 的 re 模块或 regex 库。基本的 Unicode 属性分类 {代码...} 基本的 Unicode 子属性Le...

qbit阅读 4.3k

Python + Sqlalchemy 对数据库的批量插入或更新(Upsert)
由于不同数据库对这种 upsert 的实现机制不同,Sqlalchemy 也就不再试图做一致性的封装了,而是提供了各自的方言 API,具体到 Mysql,就是给 insert statement ,增加了 on_duplicate_key_update 方法。

songofhawk1阅读 1.9k评论 4

封面图
Go for 循环有时候真的很坑。。。
大家好,我是煎鱼。不知道有多少 Go 的面试题和泄露,都和 for 循环有关。今天我在周末认真一看,发现了 redefining for loop variable semantics 。著名的硬核大佬 Russ Cox 表示他一直在研究这个问题,并表示十...

煎鱼阅读 3.4k

打脸了兄弟们,Go1.20 arena 来了!
大家好,我是煎鱼。大概半年前,我写过一篇文章《Go 要违背初心吗?新提案:手动管理内存》。有兴趣了深入解的同学,可以再回顾一下。当时我们还想着 Go 团队应该不会接纳,至少不会那么快:懒得翻也可以看我再次...

煎鱼阅读 3.1k

docker 打包 selenium+chromedriver+chrome 遇到的坑和解决方案
docker 跑 selenium 的时候遇到了很多坑,记录一下排坑过程Python 使用 selenium+chromedriver+chrome 实现网页截图Dockerfile {代码...} 让我们一行一行来看RUN (echo &quot;deb http://mirrors.aliyun.com/debi...

ponponon阅读 1.9k

未上线的猫。

1.4k 声望
130 粉丝
宣传栏