【问题标题】:Compile python modules for arm64 architecture为 arm64 架构编译 python 模块
【发布时间】:2022-01-31 11:52:30
【问题描述】:

我一直在尝试安装一些使用C 代码的python 模块,这些代码是基于主机架构编译的。最终的脚本将部署在无法访问 Internet 的 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

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

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

【问题讨论】:

    标签: python docker arm64


    【解决方案1】:

    您收到此错误是正常的。您的 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 映像(将交叉编译的模块复制到其中)并使用上面的相同命令将目标架构设置为 arm64v8

    【讨论】:

      【解决方案2】:

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

      查看示例:https://www.96boards.org/documentation/guides/crosscompile/commandline.htmlhttps://github.com/tpoechtrager/osxcross

      【讨论】:

        猜你喜欢
        • 2017-12-15
        • 1970-01-01
        • 2018-09-06
        • 1970-01-01
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        相关资源
        最近更新 更多