本文最后更新于:2024年1月19日 上午

python 公用的包可以使用 pip 管理工具方便地下载、使用、管理,那么如何将自己的工具包上传到 pip 服务器供别人下载呢,本记录相关内容。

简介

python 包可以使用 pip 工具方便地管理,分享和使用。

  • 使用python包模块有很多好处:
  1. 可以使用pip之类的命令来管理和安装python模块,避免手动管理引用文件。
  2. 方便共享我们的python包。
  3. 在一个模块中可以添加文档。
  4. 在python包与包之间有很多的相互依赖,引入包模块可以预先加载所有需要的包,避免由于模块之间依赖造成的问题。

pip 源初始的形态,我们希望把自己的包也上传到这里。

创建自己的 python 包

先置条件

要把自己的包发布到pip上,需要满足以下几个条件:

  • 目录下的所有文件名均为英文小写
  • 不包含下划线,空格和特殊字符(支持中划线,但也不建议使用)
  • 选定的包名在 pypi 网站上没有使用过,可以访问官网,搜索一下想用的名字有没有被占用。

包结构

我们的包名称为 utils-vvd(示例)

1
2
3
4
utils-vvd
__init__.py
core.py
setup.py
  • 需要在包最外层目录创建 setup.py 文件,用于打包和发布

  • setup.py 文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from setuptools import setup, find_packages

str_version = '1.0.31'

setup(name='utils-vvd',
version=str_version,
description='Commonly used function library by MT',
url='https://github.com/zywvvd/utils_vvd',
author='zywvvd',
author_email='zywvvd@mail.ustc.edu.cn',
license='MIT',
packages=find_packages(),
zip_safe=False,
include_package_data=True,
install_requires= ['pypinyin', 'opencv-python'],
python_requires='>=3')
  • 其中 packages

  • 参数说明

    参数 说明
    version 包发布版本
    description 描述信息,会在 pip show 中展示
    url 个人相关链接(不重要)
    author 作者
    author_email 作者邮箱
    license 许可
    packages 表示需要打包的名单,惯例是使用 setuptoolsfind_package 工具收集目录中含有 __init__.py 文件的文件夹
    zip_safe 是否使用 zip 压缩
    include_package_data 接受 MANIFEST.in 匹配的所有数据文件和目录。
    install_requires 重要包的相关依赖,在安装该包之前会检查列表中的依赖项并自动安装
    python_requires python 版本需求

pypi 打包非 py 文件

  • 可以在 pypi 包中打包非 py 文件,需要在 setup.py 文件中额外指定
  • 建立 config 对象,使用 add_data_files 函数添加文件路径
  • 示例 setup.sh
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
39
40
import sys
import setuptools
from setuptools import find_packages, setup
from numpy.distutils.core import setup
from numpy.distutils.misc_util import Configuration
from os.path import join, dirname, realpath

str_version = '2.0.15'



def configuration(parent_package='', top_path=''):
# this will automatically build the scattering extensions, using the
# setup.py files located in their subdirectories
config = Configuration(None, parent_package, top_path)

pkglist = setuptools.find_packages()
for i in pkglist:
config.add_subpackage(i)
config.add_data_files(join('mtutils', 'assets', '*.json'))
config.add_data_files(join('mtutils', 'assets', '*.jpg'))

return config


if __name__ == '__main__':
pass
setup(
configuration=configuration,
name='mtutils',
version=str_version,
description='Commonly used function library by MT',
url='https://github.com/zywvvd/utils_vvd',
author='zywvvd',
author_email='zywvvd@mail.ustc.edu.cn',
license='MIT',
packages=['mtutils'],
zip_safe=False,
install_requires= ['numba', 'func_timeout', 'pypinyin', 'opencv-python', 'sklearn'],
python_requires='>=3')

pypi 账号

  • 进入官网创建账号 https://pypi.org/

  • 在家目录创建文件

    • Linux : ~/.pypirc
    • Windows: C:\Users\Username\.pypirc
  • 文件内容:

1
2
3
4
5
6
7
[distutils]
index-servers=pypi

[pypi]
repository = https://upload.pypi.org/legacy/
username = __token__
password = <your-token(with pypi-)>

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

当前 Pypi 强制要求 2FA 验证方式,不再支持账户密码上传包,需要用户在开通 2FA 验证后使用 API Token

之后 用户名为 __token__ 密码为 <token_value>

发布 python 包

  • 在命令行中切换到当前目录,输入:
1
python setup.py sdist

会在当前目录生成 dist 文件夹

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

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

    安装 twine :

    1
    pip install twine

生成 whl 包

  • 安装 whell 升级 setuptools
1
2
pip install wheel
pip install --upgrade setuptools
  • 执行命令
1
python setup.py bdist_wheel
  • dist 文件夹中会生成 whl 包
  • 可以 pip install xxx.whl 直接安装

管理你的包

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

分享包

  • 现在链接互联网的人讲道理可以使用如下命令来安装我们的包
1
pip install utils-vvd

但是会有一些问题,在国内一般都会换成阿里、清华、中科大等pip源,使用这些默认源无法下载到我们的包

需要手动指定 pypi 源才可以正确下载:

1
pip install -i https://pypi.org/project utils-vvd

然后过几天,常用的镜像就会把你的包同步进去,就可以不用指定官方项目地址安装包了

可能遇到的错误

  • 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
    文件已经存在了,你每一次上次都应该更新版本号。

  • colorama\ansitowin32.py line 59, in closed return stream.closed

    解决方案

参考资料



文章链接:
https://www.zywvvd.com/notes/coding/python/create-my-pip-package/create-my-pip-package/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

将自己的 python 包添加到 pip 源 Pypi
https://www.zywvvd.com/notes/coding/python/create-my-pip-package/create-my-pip-package/
作者
Yiwei Zhang
发布于
2021年11月3日
许可协议