Cane's Blog

Cane

【Python】打包发布流程

43
2022-02-24

一、目录结构

.
├── myapp
│ └── __init__.py
└── setup.py

注: myapp 里面是存放源码的文件夹,里面必须有一个 __init__.py 文件

二、setup.py

from setuptools import setup

setup(
    name='firstApp', # 应用名
    version='0.0.1', # 版本号
    packages=['myapp'], # 包括在安装包内的 Python 包
)

三、打包

1. 基于setuptools打包

  • sdist 打包
    使用 sdist 可以打包成 source distribution,支持的压缩格式有:

    Format

    Description

    Notes

    zip

    zip file (.zip)

    Windows 默认

    gztar

    gzip tar file (.tar.gz)

    Unix 默认

    bztar

    bzip tar file (.tar.bz2)

    xztar

    xz tar file (.tar.xz)

    ztar

    compressed tar file (.tar.Z)

    tar

    tar file (.tar)

    命令:

    python setup.py sdist --formats=gztar,zip

    现在目录下多出 dist*.egg-info 目录,dist 内保存了我们打好的包,上面命令使用 --formats 指定了打出 .tar.gz.zip 包,如果不指定则如上表根据具体平台默认格式打包。

    包的名称为 setup.py 中定义的 nameversion 以及指定的包格式,格式如:firstApp-0.0.1.tar.gz

  • bdist 打包

    Format

    Description

    Notes

    gztar

    gzip tar file (.tar.gz)

    Unix 默认

    bztar

    bzip tar file (.tar.bz2)

    xztar

    xz tar file (.tar.xz)

    ztar

    compressed tar file (.tar.Z)

    tar

    tar file (.tar)

    zip

    zip file (.zip)

    Windows 默认

    rpm

    RPM

    pkgtool

    Solaris pkgtool

    sdux

    HP-UX swinstall

    wininst

    self-extracting ZIP file for Windows

    msi

    Microsoft installer

    命令:

    python setup.py bdist --formats=rpm

2. 基于 wheel 打包

python setup.py bdist_wheel

执行成功后,目录下除了 dist*.egg-info 目录外,还有一个 build 目录用于存储打包中间数据。

wheel 包的名称如 firstApp-0.0.1-py3-none-any.whl,其中 py3 指明只支持 Python3。

可以使用参数 --universal,包名如 mfirstApp-0.0.1-py2.py3-none-any.whl,表明 wheel 包同时支持 Python2 和 Python3

使用 --universal 生成的也被称为通用 wheel 包,反之称为纯 wheel 包。

四、上传

  1. 安装 twine

    pip install twine
  2. 上传

    twine upload dist/*
    
    twine upload -r test-pypi dist/* # 上传到测试仓

    上传官方源需要注册 pypi 帐号

    登录 https://pypi.python.org/pypi,进入 Register 注册账号,然后执行命令上传(需要输帐号密码)

    如果不想每次输入账号密码,可以在家目录 linx: ~/.pypirc,windows 在文件夹目录里输入%USERNAME%下创建 .pypirc 文件,内容如下

    这里配置了官方的 pypi 和 pypitest,若要配置其他仓库,按格式添加。

    [distutils]
    index-servers =
        pypi
        pypitest
    
    [pypi]
    repository: https://pypi.python.org/pypi
    username: 
    password: 
    
    [pypitest]
    repository: https://test.pypi.org/legacy/
    username: 

五、更新

1. 更新 package 里面的源代码

2. 更新 setup.py 里面的版本信息

3. 重新打包 python setup.py bdist_wheel

4. 重新上传 twine upload -r test-pypi dist/*

六、其他

  • setup.py 配置项说明

    name: 你定义的包名,可以用字母、数字、下划线,需要确保唯一性。
    
    version: 项目的版本号。
    
    author: 你(作者)的名称。
    
    author_email: 你(作者) 的邮箱。
    
    description: 项目的简要描述。
    
    long_description_content_type:长描述内容的使用的标记类型,一般为 markdown 或者 rst。
    
    url: 你这个项目的主页地址,也可以直接链接到你这个项目的Github 地址上面去。
    
    include_package_data: 是否添加 py 以外的文件。
    
    package_data: 需要添加 Python 的额外文件列表。
    
    packages: 直接用 setuptool 找到你项目所有相关的包列表。
    
    classifiers: 附加说明,比如这里写的就是使用于 Python3 版本,使用的是 MIT 协议,独立于 OS。
    
    python_requires: python 版本要求。

    详见:https://blog.csdn.net/chenfeidi1/article/details/80873979