我在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。
1条答案
按热度按时间uurv41yg1#
如果你想在多个平台上运行你的软件,你必须为每个平台单独编译它。正如Pyinstaller文档中所指出的:
如果您需要为多个操作系统(例如Windows和macOS)分发应用程序,则必须在每个平台上安装Pyrocast,并在每个平台上单独捆绑应用程序。
这也适用于不同平台上的安装,例如不同的CPU架构。值得注意的是,Raspberry Pi 4使用基于ARM的CPU架构,因此为其他CPU架构编译的软件将无法在Raspberry Pi 4上运行。您需要编译软件(运行pyinstaller),以便在基于ARM的平台上运行编译后的软件。很可能,你已经在AMD 64计算机上编译了软件。
既然你提到你是在Docker中构建的,你可能只需要使用Docker的ARM平台仿真来完成这一点。例如,在你的dockerfile中,你可以这样做:
字符串
或者你可以省略
--platform
参数,设置环境变量DOCKER_DEFAULT_PLATFORM
来控制docker使用的平台。例如,您可以构建两个映像,每个平台一个,执行以下操作:
型
您还可以考虑使用
docker buildx
构建multi-platform images,以内联构建多个平台:型
或者,你也可以在原生的ARM64系统(或带有ARM64的仿真系统)上运行
pyinstaller
,比如直接在Raspberry Pi上运行。pyinstaller文档还提供了一些虚拟化建议。