Python 打包基于平台的 Python Wheel 包并上传到 PYPI

codeskyblue · 2020年04月03日 · 最后由 codeskyblue 回复于 2020年04月05日 · 4431 次阅读

背景

之前写过一个文档 发布 Python 库到 https://pypi.org Step By Step 教程
不过根据这个教程发布的库只能是 Pure Python 的库,如果想放点二进制文件进来该怎么办呢。

文章通过详细的步骤,演示如何将 ADB.exe 文件打包进 adbutils 这个库的 whl 文件中。

实操

这里我用我很早之前写的adbutils库,库的用途是通过与 adb server 通信,完成 adb 的相关操作。
而我们即将做的是将 windows 平台上的 adb.exe 和一些 dll 文件,打包到 whl 文件中,然后发布到 pypi 上

下载源码

git clone https://github.com/openatx/adbutils
cd adbutils
mkdir binaries

打包二进制文件到 whl 文件中

如果电脑上没有 adb.exe 文件,可以从这个地址下载 https://raw.githubusercontent.com/openatx/adb-binaries/master/1.0.41/adb-win32-1.0.41.zip

解压后有 3 个文件 AdbWinApi.dll AdbWinUsbApi.dll adb.exe

拷贝到刚创建的这个 binaries 这个目录中

运行命令 python3 setup.py sdist bdist_wheel,在 dist 目录中会找到类似这样命名的文件 adbutils-0.7.2-py3-none-any.whl

python3 setup.py sdist bdist_wheel

cd dist
python3 -m wheel unpack adbutils-0.7.2-py3-none-any.whl # 版本号可能不是这个了

# whl中的文件会解压到adbutils-0.7.2这个目录中
cd adbutils-0.7.2
rm adbutils-0.7.2.dist-info/RECORD

whl 文件名命令规则 {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl

规则的定义参考:https://www.python.org/dev/peps/pep-0425/

python tag: py3 | py37 | py2 | py2.py3
abi tag: none # 一般都是这个

platform tag: win32 | win_amd64 | manylinux2010_x86_64 | linux_i386 | linux_x86_64 
# 官网上说的感觉也不详细,举的例子也很少
# 通过代码 python3 -c 'import distutils.util; print(distutils.util.get_platform())'  可以查到当前系统的platform标识

我们打的 whl 的文件名命名为 adbutils-0.7.2-py3-none-win32.whl
打开 WHEEL 文件,路径位于 adbutils-0.7.2.dist-info/WHEEL
内容大致如下

Wheel-Version: 1.0
Generator: bdist_wheel (0.33.6)
Root-Is-Purelib: true
Tag: py3-none-any

将两个 Tag 只保留一行,并修改为 Tag: py3-none-win32
然后执行 python3 -m wheel pack adbutils-0.7.2 就可以打包出来 adbutils-0.7.2-py3-none-win32.whl来了。

常见 WHEEL 格式名

py3-none-manylinux2010_x86_64.whl  # Linux
py3-none-macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl # Darwin
py3-none-win32.whl # Win32
py3-none-win_amd64.whl # Win64

上传

pip3 install twine
twine upload dist/*

# 或者使用用户名密码上传
twine upload --repository-url https://pypi.org/simple/ -u codeskyblue -p xxxxxxx dist/*

用脚本实现(总结)

盲写的,没测试。仅供参考

DIST_NAME="adbutils"
VERSION=0.7.2
WHLFILE="dist/$DIST_NAME-$VERSION-py3-none-any.whl"
DIST_DIR="dist/$DIST_NAME-$VERSION"
DISTINFO_DIR="$DIST_DIR.dist-info"
DIST_WHEEL_FILE="$DISTINFO_DIR/WHEEL"

python3 setup.py sdist bdist_wheel
python3 -m wheel unpack $WHLFILE
rm $DISTINFO_DIR/RECORD
set -i 's/Tag:/Tag: py3-none-win32/' $DIST_WHEEL_FILE

python3 -m wheel pack $DIST_DIR

参考资料

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

很完整的文章,各种 python 官方地址,很齐全。

想请教下,文章中用到的 adb 二进制文件应该是 windows 用的。如果这个包想要做到跨平台可用,不同平台用不同的二进制文件,这个怎么操作?

陈恒捷 回复

先准备好不同平台的二进制文件,每次打包修改 WHELL 文件中的 Tag(每个 Tag 对应不太的平台),然后将对应平台的二进制文件拷贝进去,再用 pack 命令打包,就可以了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册