Pyinstaller 与 Jenkins 用于 Raspberry PI 中的可执行文件

问题描述 投票:0回答:1

我在

image 'python:3.11'
Linux 上使用 Jenkins-pipeline 和 Docker
5.10.0-23-cloud-amd64
,使用 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版本,手动创建构建。

python jenkins pyinstaller raspberry-pi4
1个回答
0
投票

如果您想在多个平台上运行软件,则必须为每个平台单独编译它。如 Pyinstaller 文档中所述:

如果您需要为多个操作系统分发应用程序,例如 Windows 和 macOS,则必须在每个平台上安装 PyInstaller,并在每个平台上单独捆绑您的应用程序。

这也适用于不同平台上的安装,例如不同的 CPU 架构。值得注意的是,Raspberry Pi 4 使用基于 ARM 的 CPU 架构,因此为其他 CPU 架构编译的软件无法在 Raspberry Pi 4 上运行。您需要在基于 ARM 的环境中编译该软件(运行 pyinstaller),以便在基于 ARM 的平台上运行编译后的软件。您很可能是在 AMD64 计算机上编译了该软件。


既然您提到您正在 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 built ...

您还可以考虑使用 docker buildx 构建

多平台图像
,以内联构建多个平台:

docker buildx build --platform linux/amd64,linux/arm64 ...
© www.soinside.com 2019 - 2024. All rights reserved.