Pyinstaller与Jenkins在树莓派中的可执行文件

bjg7j2ky  于 11个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(169)

我在5.10.0-23-cloud-amd64 Linux上使用Jenkins-pipeline和Docker image 'python:3.11',通过Pyinstaller创建一个可执行文件。
构建命令:pyinstaller --onefile main.py
在我尝试下载并在其他Linux系统上运行创建的文件后,我没有遇到任何问题,但在Raspberry PI 4中,我可以得到此错误:
-bash:./main:二进制文件不可执行:文件格式无效
Pi操作系统:Linux raspberrypi 6.1.0-rpi4-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.54-1+rpt2 (2023-10-05) aarch64 GNU/Linux
导致问题的原因是什么?
我试着改变Python版本,用手工创建build。

uurv41yg

uurv41yg1#

如果你想在多个平台上运行你的软件,你必须为每个平台单独编译它。正如Pyinstaller文档中所指出的:
如果您需要为多个操作系统(例如Windows和macOS)分发应用程序,则必须在每个平台上安装Pyrocast,并在每个平台上单独捆绑应用程序。
这也适用于不同平台上的安装,例如不同的CPU架构。值得注意的是,Raspberry Pi 4使用基于ARM的CPU架构,因此为其他CPU架构编译的软件将无法在Raspberry Pi 4上运行。您需要编译软件(运行pyinstaller),以便在基于ARM的平台上运行编译后的软件。很可能,你已经在AMD 64计算机上编译了软件。
既然你提到你是在Docker中构建的,你可能只需要使用Docker的ARM平台仿真来完成这一点。例如,在你的dockerfile中,你可以这样做:

FROM --platform=linux/arm64 python:3.11
# ...

字符串
或者你可以省略--platform参数,设置环境变量DOCKER_DEFAULT_PLATFORM来控制docker使用的平台。
例如,您可以构建两个映像,每个平台一个,执行以下操作:

DOCKER_DEFAULT_PLATFORM=linux/amd64 docker build ...

DOCKER_DEFAULT_PLATFORM=linux/arm64 docker build ...


您还可以考虑使用docker buildx构建multi-platform images,以内联构建多个平台:

docker buildx build --platform linux/amd64,linux/arm64 ...


或者,你也可以在原生的ARM64系统(或带有ARM64的仿真系统)上运行pyinstaller,比如直接在Raspberry Pi上运行。pyinstaller文档还提供了一些虚拟化建议。

相关问题