有一块arm32架构busybox操作系统的板子,实验室需要移植一套python代码上去,因此开启了pyinstaller移植之路,这篇文章是本人的探索过程,欢迎大家来讨论。
DAY 1
在ubuntu20.04虚拟机上使用pyinstaller进行可执行文件生成,过程比较简单,但是发现只能生成x86架构下的可执行文件。手边有一块arm64的树莓派,感觉也不太可行,查了一些资料,选择采用docker构建仿真环境。
DAY 2
docker成功pull到了arm32架构ubuntu:20.04镜像,但是docker run报错,原因是该镜像不能在x86架构电脑上运行,解决办法:QEMU构建虚拟环境
docker run --it arm32v7/ubuntu:20.04 uname -m
//standard_init_linux.go:211: exec user process caused "exec format error"
sudo apt-get install qemu binfmt-support qemu-user-static // 安装qemu包
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes // 这一步将执行注册脚本(docker+qemu功能)
docker run --it arm32v7/ubuntu:20.04 uname -m // 测试仿真环境
成功构建docker容器,安装python和pyinstaller,对python文件进行交叉编译生成可执行文件。
apt-get update
apt-get install -y python3 python3-pip
pip3 install pyinstaller
pyinstaller --onefile script.py
新的问题又出现了,生成的可执行文件并不能在arm32板上运行,原因是pyinstaller的平台使用的是glibc2.29,但是arm板非常古老,只有glibc2.15。
(没有我这个问题的看到这就可以结束了)
DAY 3
接下来就是进行了很多尝试,包括docker不同版本的ubuntu(arm32位架构的ubuntu不是很好找,我找到最古老的版本是14.04),搭建不同版本的python环境,安装不同版本的pyinstaller库,但是最后还是没有成功,这里记录一下最后一次尝试。
操作系统:ubuntu:14.04
python:3.4.4
pyinstaller:3.0
docker run -it --name=zly ubuntu:14.04
apt-get install -y python3 python3-pip
pip3 install pyinstaller==3.0 //其他版本需要考虑兼容问题
adduser zly //不支持以root权限运行pyinstaller 需要创建新用户
su zly //这里可以使用pyinstaller命令,但是发现没有bootloader,需要去安装
cd /usr/local/lib/python3.4/dist-packages
mkdir pyinstaller-build
cd pyinstaller-build
apt install wget
wget https://files.pythonhosted.org/packages/source/P/PyInstaller/PyInstaller-3.0.tar.gz
tar -xzvf PyInstaller-3.0.tar.gz
cd PyInstaller-3.0
python3 setup.py install//安装了bootloader
cd /usr/local/lib/python3.4/dist-packages/PyInstaller/bootloader
ls
可以看到确实有了bootloader文件
但是进入用户权限运行是还是报错,没有bootloader,
可以看到生成的bootloader并不是arm32架构的
DAY 4
本来已经打算放弃了,但是突发奇想ubuntu20.04上可以正常使用pyinstaller,那一定有arm32的bootloader文件,进入对应位置查看发现确实存在。
拷贝到ubuntu14.04对应文件夹下
docker cp 7d3ac49d7ad8:/usr/local/lib/python3.8/dist-packages/PyInstaller/bootloader/Linux-32bit-arm /home/walter/Desktop/bootloader
docker cp /home/walter/Desktop/bootloader/Linux-32bit-arm 0fb45997c3ab:/usr/local/lib/python3.4/dist-packages/PyInstaller-3.0-py3.4.egg/PyInstaller/bootloader
pyinstaller后成功生成了可执行文件,但是运行报错
编辑生成的mainhello.spec文件,添加共享库到 binaries 列表中:
binaries=[('/usr/lib/arm-linux-gnueabihf/libpython3.4m.so.1.0', '.')], // 添加依赖库
hiddenimports=['serial'], //添加python文件所需库
使用修改后的 .spec文件重新构建可执行文件:
pyinstaller mainhello.spec
运行遇到报错
zly@0fb45997c3ab:~/myproject$ LD_LIBRARY_PATH=/usr/lib/arm-linux-gnueabihf ./dist/hello2/hello2
[2440] Cannot dlsym for Py_DecodeLocale
升级pyinstaller库到3.5版本,最后成功运行!
拷贝到arm板操作系统上进行运行发现报错,尝试了将libpython3.4m.so.1.0联合打包为可执行文件还是报错
最后直接将libpython3.4m.so.1.0文件也直接打包到操作系统,理论能够运行,但是glibc的版本是2.17,还是不支持。
也没有找到更老的ubuntu版本支持arm32架构,只能做到这了,awsl~