Pyinstaller生成ARM32位可执行文件

        有一块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~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值