python基于setuptools的打包和分发

简介

Setuptools是基于distutils增强的工具,旨在让用户更简单地构建(build)和分发(distribute)python的package。

主要功能:

  • 在构建的时候,自动使用EasyInstall tool来下载、安装、更新其他依赖。
  • 创建Python Eggs,一种可移动的分发格式。
  • 无需MANIFEST.in文件

安装

1
pip install -U setuptools

使用

基础使用

1
2
3
4
5
6
from setuptools import setup, find_packages
setup(
name="HelloWorld",
version="0.1",
packages=find_packages(),
)

参数含义:

名称 说明
name 项目名称
version 项目版本
packages 项目包含的数据
entry_points 项目的主入口
install_requires 项目依赖包
url 项目地址
author 项目作者
author_email 作者邮箱
description 项目简要描述

扩展(extension)

extension

Distutils目前只支持C/C++/Objective-Ç

打包

源码包(source distribution, sdist)

1
python setup.py sdist

生成的是dist/xxx.tar.gz

wheel

wheel本质上是一个zip包格式,它使用.whl 扩展名,用于 python 模块的安装,它的出现是为了替代 Eggs。

1
python setup.py bdist_wheel

生成的是带平台信息的.whl文件,比如pytorch在pypi上的文件:

image

其中manylinux1需要注意,这种格式支持多多数linux系统。参考这篇文章

我的做法是:使用这个仓库提到的镜像:quay.io/pypa/manylinux2010_x86_64。在该镜像下先生成.whl。然后进入镜像,使用auditwheel工具将其修改为manylinux1

1
2
3
pip3 install auditwheel
auditwheel show xxx-linux_x86_64.whl
auditwheel repair --plat manylinux2010_x86_64 xxx-linux_x86_64.whl

得到manylinux1_x86_64.whl

.whl文件像是一个安装包,你需要把这个安装包上传到pypi的网站上让其他人用。你自己也可以直接:

1
pip install xxx.whl

来安装这个包。

注意:如果是tensorflow相关的打包,可以修改policy.json,参考这里。另外,tensorflow相关打包的镜像推荐使用(参考):

1
2
# For manylinux2010
docker pull tensorflow/tensorflow:custom-op-ubuntu16

检查

1
twine check dist/*

分发

~/.pypirc中配置用户名和密码:

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

[pypi]
username:xxxxxxxxxxxxx
password:xxxxxxxxxxxxx

上传:

1
twine upload dist/xxx.whl