我在
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版本,手动创建构建。
如果您想在多个平台上运行软件,则必须为每个平台单独编译它。如 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 ...