【问题标题】:Module installed but can't find a shared library installed by Brew已安装模块但找不到 Brew 安装的共享库
【发布时间】:2021-05-15 05:06:50
【问题描述】:

我需要安装一个模块 pyzbar,它依赖于另一个名为 zbar 的模块。根据pypilink我首先需要通过安装zbar

brew install zbar

然后安装pyzbar

pip install pyzbar

当尝试基于导入模块的特定部分运行代码时,它会给出错误。

from pyzbar.pyzbar import decode

错误是 ImportError: 找不到 zbar 共享库

如何检查问题究竟出在哪里以及如何解决?

以下是我在检查 cmets 后采取的步骤: 1-尝试查找 libzbar 文件以及如何将其链接到路径,以便 pyzbar 文件 zbar_library.py 可以找到它。 libzbar 文件位于此位置 /opt/homebrew/Cellar/zbar/0.23.90 由 homebrew 安装,而不是在 usr/local/lib 中(令人惊讶的是,我的 mac 上不存在这样的目录)。我将zbar lib文件的位置添加到路径的方式是

export DYLD_LIBRARY_PATH=/opt/homebrew/lib

当我在运行 python 的 conda 环境中时,在终端中。现在,当尝试在导入 pyzbar 时运行 python 时,它会发现一些东西并且不再给出“找不到共享库”错误,而是给出以下错误:

  File "/Users/username/miniconda3/envs/my_env/lib/python3.7/site-packages/pyzbar/zbar_library.py", line 66, in load
    libzbar = cdll.LoadLibrary(path)
  File "/Users/username/miniconda3/envs/my_env/lib/python3.7/ctypes/__init__.py", line 442, in LoadLibrary
    return self._dlltype(name)
  File "/Users/username/miniconda3/envs/my_env/lib/python3.7/ctypes/__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(/opt/homebrew/lib/libzbar.dylib, 6): no suitable image found.  Did find:
    /opt/homebrew/lib/libzbar.dylib: mach-o, but wrong architecture
    /opt/homebrew/Cellar/zbar/0.23.90/lib/libzbar.0.dylib: mach-o, but wrong architecture
    /opt/homebrew/lib/libzbar.dylib: mach-o, but wrong architecture
    /opt/homebrew/Cellar/zbar/0.23.90/lib/libzbar.0.dylib: mach-o, but wrong architecture

【问题讨论】:

  • 我猜不会,如果发生这种情况,错误可能会以不同的方式纠正您确定您正在将软件包下载到相同的环境并当前使用该环境
  • Homebrew 应该链接 /usr/local/lib 中的库。如果它在那里(查找名为 libzbar.so 或类似文件),那么您的库搜索路径可能不包括 /usr/local/lib。
  • 我刚刚了解到 Homebrew 安装在 /opt/homebrew/ 而不是 /usr/local/ 用于新的 Apple Silicon 机器。那是你所拥有的吗?无论如何,对于 macOS,用于搜索共享库的路径是 DYLD_LIBRARY_PATH,而不是 PATH(这是可执行文件的搜索路径)。
  • 所以你有英特尔和苹果硅二进制文件的混合,不能一起工作......你是通过 Homebrew 安装 Python,还是以其他方式安装 Python? file /opt/homebrew/lib/libzbar.dylib 应该告诉你这个库是 Intel (x86_64) 还是 Apple Silicon (arm64)。因为它是通过 Homebrew 安装的,所以我假设它会说 arm64。 Python 二进制文件应该是相同的,也是 arm64。我猜不是。如果是这样,则需要升级 Python,或者卸载它,然后通过 Homebrew 安装。
  • 哦,我现在看到您正在使用 Miniconda 并且拥有 Python 3.7。如果为 arm64 重新构建了这样一个旧版本的 Python,我会感到惊讶,所以可能是你的问题。

标签: python python-3.x image-processing barcode-scanner


【解决方案1】:

您可能有多个导致此类问题的 python/pip 版本。为了确定这一点,您可以尝试

python3.9 -m pip install pyzbar

python3.9
from pyzbar.pyzbar import decode

如果导入仍然有任何错误,请通过执行包含所有已安装 pip 包的列表

pip freeze --all

【讨论】:

    【解决方案2】:

    即使您已正确配置路径,您的操作系统也可能有两个版本的 python,您的系统将库安装在默认 python 中,而不是您想要的版本。

    安装python后的默认目录取决于你的系统。

    您可以直接安装指定哪个版本将接收库:

    python3.9 -m pip install "package"
    python3.7 -m pip install "包"
    python2.7 -m pip install "包"

    始终建议使用版本管理器,将版本分开并且可以单独使用的虚拟环境

    reference install package

    【讨论】: