我有一个 python 应用程序,下游依赖于仅作为 X86 提供的动态库。
该应用程序在 X86 MacOS 计算机上运行,但在 ARM MacOS 计算机上失败并显示
ImportError
。
我已经在库上运行了
lipo -archs
,但它们只是 x86_64
。我在 virtualenv 中运行 Python,它是通用二进制文件 x86_64 arm64
。应用程序安装时构建的中间目标文件也是通用二进制文件x86_64 arm64
。
我怀疑 Python 作为 ARM 应用程序本地运行,但由于依赖关系,我需要它作为 X86 应用程序运行。
我可以使用 MacOS 或 Rosetta2 选项或环境设置来强制执行 X86 Python 二进制文件而不是 ARM 二进制文件吗?
Conda 可以在 Mac Arm 上创建 x86 环境。
conda create -n my_x86_env -y
conda activate my_x86_env
conda config --env --set subdir osx-64
conda install python=3.10
conda install numpy
pip install networkx
对于此环境(
my_x86_env
),python 和 pip 是 x86 版本,因此它们只会从 anaconda、conda-forge 和 pypi 获取 x86 版本。您在不运行 conda config --env --set subdir osx-64
的情况下创建的任何环境都将是 arm64 环境。因此,您可以在需要时获得本机速度,并在需要时获得与仅 x86 软件包的兼容性。
看起来唯一的方法是安装 X86 版本的 python。
我在这里找到了如何指导 - https://towardsdatascience.com/how-to-use-manage-multiple-python-versions-on-an-apple-silicon-m1-mac-d69ee6ed0250
但无法完全让 pyenv 构建部分正常工作。
所以在Rosetta i386终端中我brew86安装了python。这将 X86 版本的 python 放入
/usr/local/bin/python3
中,我可以从中创建仅 X86 的 virtualenv。
大体上,步骤来自上面的链接(减去 pyenv 部分):
/usr/local/bin/brew
/usr/local/bin/python3
)您可以在使用
arch
命令执行通用二进制文件时选择所需的架构。
在终端中写入:
arch -x86_64 python -m pip install --user virtualenv
arch -x86_64 python -m venv env
source env/bin/activate
arch -x86_64 python -m pip install numpy
执行脚本或模块时,必须在 python 命令前添加
arch -x86_64
,例如:
arch -x86_64 python my_script.py