为 arm64 架构编译 python 个模块

Compile python modules for arm64 architecture

我一直在尝试安装一些 python 模块,这些模块使用 C 代码,这些代码是根据主机的体系结构编译的。最终脚本将部署在无法访问互联网的 arm64 架构上,因此无法直接在其上安装模块。我的机器是 Intel Mac,所以它的架构与 arm64 不同。我正在考虑用 arm64v8/python docker 图像创建一个 docker 图像,然后将其传输到 arm64,但我得到以下错误:

Using default tag: latest
latest: Pulling from arm64v8/python
no matching manifest for linux/amd64 in the manifest list entries

这意味着该解决方案将不起作用。

有没有人对如何解决此类问题有任何提示或技巧?

出现此错误是正常的。您的 Mac 是一台 x86_64 机器,arm64v8/python 图像的清单不包含您的架构,因此您不能 运行 它。

但是,您尝试实现的目标是可能的,而且您的方向是正确的。我认为 the Docker docs here 是实现这一目标的良好起点。

如果您使用的模块已经为 arm64v8 编译,而您只是使用 pip3 下载它们,那么您可以尝试构建图像,目标 arm64v8.尝试以下命令,看看您是否能够构建图像:

docker buildx build --platform linux/arm64/v8 -t your-arm-image:latest .

如果这不起作用,那么解决方案是针对 arm64v8 架构构建您的代码(和模块)。你自己做这个 Mac - 这叫做交叉编译。查看您的 Python 版本是如何完成的。 完成后,您可以构建 Docker 映像(将 cross-compiled 模块复制到其中)并使用上面的相同命令将目标体系结构设置为 arm64v8

您的问题的解决方案是 Cross-Compilation。 Cross-compilation 表示在机器 2 (arch1) 上编译程序,在机器 2 (arch2) 上将是 运行,其中 arch1 != arch2。交叉编译的好库是 clang。交叉编译用法的一个很好的例子是 android 生态系统,其中您的代码是用 c/c++ 编写的,并且可以 运行 在 arm32、arm64、x86 甚至 x86_64 上。

在此处查看示例:https://www.96boards.org/documentation/guides/crosscompile/commandline.html or https://github.com/tpoechtrager/osxcross