python - 如何修复 Pycharm 中的“mach-o, but wrong architecture”错误?

我在 Mac 上的 Pycharm .py 脚本中导入 numpy 和 matplotlib 并且不断收到此错误。

/usr/bin/python3 /Users/aksseet/PycharmProjects/Election/electorate.py
/Users/aksseet/PycharmProjects/Election/electorate.py:1: UserWarning: The NumPy module was reloaded (imported a second time). This can in some cases result in small but subtle 
issues and is discouraged.
  import numpy as np
Traceback (most recent call last):
  File "/Users/aksseet/PycharmProjects/Election/electorate.py", line 2, in <module>
    import matplotlib.pyplot as plt
  File "/Users/aksseet/Library/Python/3.8/lib/python/site-packages/matplotlib/__init__.py", line 107, in <module>
    from . import _api, cbook, docstring, rcsetup
  File "/Users/aksseet/Library/Python/3.8/lib/python/site-packages/matplotlib/rcsetup.py", line 24, in <module>
    from matplotlib import _api, animation, cbook
  File "/Users/aksseet/Library/Python/3.8/lib/python/site-packages/matplotlib/animation.py", line 34, in <module>
    from PIL import Image
  File "/Users/aksseet/Library/Python/3.8/lib/python/site-packages/PIL/Image.py", line 114, in <module>
    from . import _imaging as core
ImportError: dlopen(/Users/aksseet/Library/Python/3.8/lib/python/site-packages/PIL/_imaging.cpython-38-darwin.so, 2): no suitable image found.  Did find:
    /Users/aksseet/Library/Python/3.8/lib/python/site-packages/PIL/_imaging.cpython-38-darwin.so: mach-o, but wrong architecture
    /Users/aksseet/Library/Python/3.8/lib/python/site-packages/PIL/_imaging.cpython-38-darwin.so: mach-o, but wrong architecture

我已经尝试过重新安装 python、numpy 和 matplotlib。我应该怎么办?

回答1

完全免责声明:我没有 Mac,因此我无法测试此解决方案是否有效。但是,我会尽力而为,并希望至少为进一步挖掘提供了一些有用的资源。

从我正在阅读的几个 GitHub 问题中引用类似错误的内容来看,这看起来可能是您的 pip 安装程序为您的计算机抓取了错误的预构建包 wheel 并且正在安装用于不同机器的二进制文件的问题。

方法一

https://github.com/numpy/numpy/issues/17784#issuecomment-863594440,通过https://eclecticlight.co/2020/08/13/macos-version-numbering-isnt-so-simple/ SYSTEM_VERSION_COMPAT=1,这看起来很容易解决。但是,如果这不能解决问题,还有更深入的方法。

方法二

1. 使用正确的安装程序重新安装 Python

您提到您尝试重新安装 Python;我的第一个建议是确保您为处理器安装了正确的版本。我还https://github.com/numpy/numpy/issues/17784#issuecomment-727937103直接从 https://www.python.org/downloads/macos/ 安装它,而不是任何第三方包管理系统。对于 M1 Mac,https://lifehacker.com/the-difference-between-universal-and-intel-apps-and-wh-1847613701:如果您使用的是 Intel 或 Intel-only 安装程序,这可能是 pip 模块的原因使用错误的二进制文件抓取 wheel

2.1。使用自动 wheel 选择重新安装 Pillow

提供的回溯指向 Pillow 共享对象文件的问题。复制错误的最小示例应该是

from PIL import Image

Pillow 包的 GitHub 存储库上有一个 https://github.com/python-pillow/Pillow/issues/5478 与这个确切的 ImportError 相关,解决方案似乎是卸载并重新安装包,注意确保您使用与所需的 Python 安装关联的相同 pip 模块。您通常还希望确保您的 pip 模块具有最新更新。从您在示例中调用 Python 的方式来看,这可能类似于:

/usr/bin/python3 -m pip install --upgrade pip
/usr/bin/python3 -m pip uninstall Pillow
/usr/bin/python3 -m pip install Pillow

此时,安装程序应自动为您的系统选择、下载和安装正确的 wheel。但是,如果您在为另一台机器获取二进制文件时仍然遇到问题,您可以用自己的方式覆盖安装程序的选择。

2.2.重新安装 Pillow 并手动选择 wheel

要知道选择哪个 wheel,首先https://github.com/python-pillow/Pillow/issues/5093#issuecomment-745283499

/usr/bin/python3 -c "from packaging import tags; print('\n'.join([str(t) for t in tags.sys_tags()]))" | head -5

哪个,对于您的系统 - 取决于您拥有的操作系统版本、Python 版本和处理器 - 可能会有一些输出,例如

cp38-cp38-macosx_11_0_universal2
cp38-cp38-macosx_11_0_arm64
cp38-cp38-macosx_11_0_x86_64
cp38-cp38-macosx_10_15_arm64
cp38-cp38-macosx_10_15_x86_64

您可以将其与 https://pypi.org/project/Pillow/#files 匹配,下载一个带有受支持的系统标签的列表,然后从本地 .whl 文件安装它。例如,如果您支持的标签之一是 cp310-cp310-macosx_11_0_arm64.whl,您可以使用以下内容:

/usr/bin/python3 -m pip install --upgrade pip
/usr/bin/python3 -m pip uninstall Pillow
/usr/bin/python3 -m pip install Pillow-9.1.1-cp310-cp310-macosx_11_0_arm64.whl

如果需要,您几乎可以对任何其他软件包执行相同的操作。只需注意检查使用新重新安装的软件包作为依赖项的任何软件包是否具有特定的版本要求(例如,https://github.com/matplotlib/matplotlib/blob/main/setup.py)。

我希望这有帮助!

回答2

关于 M1 上的枕头的讨论在这里打开:

https://github.com/python-pillow/Pillow/issues/5093

线程中提到了这个特定的错误:

https://github.com/python-pillow/Pillow/issues/5093#issuecomment-748636026

  1. 您可能需要从源代码构建:

Pillow-8.0.1-cp38-cp38-macosx_11_0_arm64.whl.zip

或者

  1. 先做 brew install libjpeg 然后做 pip install pillow

回答3

选项1

确保您使用的是正确的 Python 版本。运行一个 shell,运行命令 file $(which python3) 并确保您机器上的结果包含一个 arm64 可执行文件。

这是我机器上的输出:

>>> file $(which python3)
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 (for architecture x86_64):       Mach-O 64-bit executable x86_64
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 (for architecture arm64):        Mach-O 64-bit executable arm64

如果输出不包含 arm64 可执行文件,请转到 https://www.python.org/downloads/macos/ 并下载一个 Universal2 安装程序(例如,此 https://www.python.org/ftp/python/3.10.4/python-3.10.4-macos11.pkg)

安装了 Python 后,我建议隔离其他可能的环境问题并使用虚拟环境。

运行以下命令,看看是否有效:

python3 -m venv env
. /env/bin/activate
pip install numpy matplotlib
python3 -c "import numpy; import matplotlib"

如果最后一个命令没有打印任何错误,那么你就是黄金!

选项#2

如果这件事似乎没有消失,而您确实需要尽快解决,我会推荐一种稍微不同的方法。

最新版本的 Docker 在 M1 MacBook 上运行良好。我一直在使用它们。

您只需安装 https://docs.docker.com/desktop/mac/apple-silicon/ 并运行包含所有内容的容器。

创建一个具有以下内容的 Dockerfile

FROM python:3.10.4-slim-bullseye

WORKDIR /app

ARG USER_NAME=user
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USER_NAME && \
    useradd --create-home --uid $USER_UID --gid $USER_GID $USER_NAME

RUN pip install --no-cache-dir numpy pandas matplotlib

CMD ["/bin/bash"]

使用以下方法构建它:

docker build -t datascience:latest -f Dockerfile .

并使用以下命令运行它:

docker run -it --rm datascience:latest /bin/bash

在容器内时,Python3 已经安装了 numpypandasmatplotlib

相似文章