背景

之前写过一个文档 发布 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

参考资料


↙↙↙阅读原文可查看相关链接,并与作者交流