之前写过一个文档 发布 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
如果电脑上没有 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
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