背景
作为一个测试,在使用 PYTHON
开发项目或者平台的时候会发现自己写的通用型功能可能每次都要拷贝到不同的项目中,如:我自己对数据库操作进行二次封装的 sql_utils
,可能由于一些扩展性需要或者修复一些缺陷就需要在每个项目里进行修改,操作起来相当繁琐并且可能出现失误。
大家肯定都用过 pip
来安装过依赖包,那么我们是否可以把自己写的公共模块通过 PYPI
来管理,这样通过 pip 就能安装了,是不是满满的成就感(╯▔▽▔)╯(╯▔▽▔)╯ !!!心动不如行动!!
步骤
关于如何将自己的项目打包上传到 PYPI
进行统一管理的基本教程很多,这里就不重复搬运了,可以参考当时我找到的一篇教程。主要记录下在这个过程中遇到的一些问题。
基本命令行
在所有流程都执行完后,每次上传版本的命令行基本如下:
修改
setup.py
文件中的version
字段版本值 ;执行
python setup.py sdist build
,本地打包构建最新版本的 dist 包;执行
twine upload --skip-existing dist/*
上传新的版本包;使用方升级
pip install --upgrade ${package_name}
。
过程中遇到的问题
问题1:在执行上述命令行的第3步时候,上传一直报错 403
具体报错信息如下:
1 | HTTPError: 403 Client Error: Invalid or non-existent authentication information. for url: https://upload.pypi.org/legacy/ |
查了下相关的问题, 如: 官网ISSUES,但看起来和我的不太一致,最终通过对比发现由于根目录下 LICENSE
文件中有一个用户名信息。
解决方案:
1 | admindeMacBook-Pro-2:date_utils xxx$ cat LICENSE |
问题2:参考官网链接里面的操作,执行到如下命令时候报错
1 | >>> python3 -m pip install --user --upgrade setuptools wheel |
解决方案:参考链接
1 | pip install wheel |
问题3: 更新代码并修改了version后执行步骤3,仍然报错
具体报错信息为:400 Client Error: File already exists
解决方案: 参考链接
1 | twine upload --skip-existing dist/* |
问题4:本地安装自己的公共库时候,提示其它依赖模块不存在。
原因:如果存在了依赖非系统自带的库的时候,比如 requests
,默认情况下打包上传后,下载的库在运行时候会报 request
不存在,没有自动安装相应的依赖。
解决办法:
在 setup.py
文件中添加配置,具体代码如下:参考链接
1 | setup( |
问题5:在Mac上打包的公共库, 但在windows上安装一直报错。
具体报错信息如下:
1 | UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in postion 2: illegal multibyte sequence |
原因是:是因为在 setup.py
文件时候,执行了 open(README.rst)
此处编码有问题。
解决办法:在 setup.py
文件中的代码进行如下修改。(但不一定是这个文件。具体要看是否有哪个代码使用了open()方法打开了中文字体的文件)参考链接
1 | open(README.rst) ==> open(README.rst, encoding='gb18030', errors='ignore') |
问题6: 上传了新的包后,在PYPI上能看到最新的包,但是通过本地pip安装一直没有找到对应的包。
原因:因为本地配置了pip的安装源为阿里云的链接,阿里云的pip源不是实时去同步PYPI上的包。
解决办法: 把本地配置的 pip.conf
里面的用户自定义配置的内容注释掉即可。