【问题标题】:Library (dylib) not loaded - image not found - Python IDE未加载库 (dylib) - 找不到图像 - Python IDE
【发布时间】:2017-12-09 10:59:34
【问题描述】:

基本上,我正在尝试从 savReaderWriter 模块运行一些 Python 代码,以便创建一个准备在 IBM SPSS 中打开的 .sav 文件。作为 macOS 用户,我需要先在终端中运行这两行代码才能使模块正常工作:

echo 'export DYLD_LIBRARY_PATH=/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/spssio/macos'  >> ~/.bash_profile
echo 'export LC_ALL=en_US.UTF-8'  >> ~/.bash_profile

您可以在下面看到我尝试在 Python 中运行的一段代码:

import savReaderWriter

savFileName = "someFile.sav"
records = [['Test1', 1, 1], ['Test2', 2, 1]]
varNames = ['var1', 'v2', 'v3']
varTypes = {'var1': 5, 'v2': 0, 'v3': 0}
with savReaderWriter.SavWriter(savFileName, varNames, varTypes, ioUtf8=True) as writer:
    for record in records:
        writer.writerow(record)

我的问题是,当通过 terminal.app 在 Python 中运行代码时,它的工作原理就像一个魅力,并且出现了一个新的 .sav 文件,尝试在 IDE 中执行相同的代码(尝试过 PyCharm 和 Spyder)会给我一个错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2847, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-94007b092d47>", line 7, in <module>
    with savReaderWriter.SavWriter(savFileName, varNames, varTypes, ioUtf8=True) as writer:
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/savWriter.py", line 198, in __init__
    super(Header, self).__init__(savFileName, ioUtf8, ioLocale)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/generic.py", line 29, in __init__
    self.spssio = self.loadLibrary()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/generic.py", line 117, in loadLibrary
    spssio = self._loadLibs("macos")
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/generic.py", line 89, in _loadLibs
    return [load(os.path.join(path, lib)) for lib in libs][-1]
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/generic.py", line 89, in <listcomp>
    return [load(os.path.join(path, lib)) for lib in libs][-1]
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ctypes/__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/spssio/macos/libicuuc48.1.dylib, 6): Library not loaded: @executable_path/../lib/libicudata48.1.dylib
  Referenced from: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/spssio/macos/libicuuc48.1.dylib
  Reason: image not found

模块作者在这个问题上无法帮助我,因此我很高兴收到这个社区的任何建议。

编辑(添加 sys.path):

从终端:

 ['',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages',
 '/Users/mg/mne-python']

来自 IDE:

['/Applications/PyCharm.app/Contents/helpers/pydev',
 '/Users/mg/Documents/Python/Projects/MD',
 '/Applications/PyCharm.app/Contents/helpers/pydev',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages',
 '/Users/mg/mne-python',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/IPython/extensions',
 '/Users/mg/Documents/Python/Projects/MD']

问候,

MG

【问题讨论】:

    标签: python ide spss dylib


    【解决方案1】:

    我不是 Mac 用户,但您真的使用 Python 3.6 吗? savReaderWriter 是否支持该版本?我怀疑它使用的 I/o 模块是为那个版本构建的。

    如果这可以通过终端而不是 IDE 工作,请检查 Python 搜索路径是否相同。

    【讨论】:

    • 虽然它不支持 v3.6,但它对我来说还可以(至少在终端中)。出现在终端中的所有搜索路径也出现在 IDE 中。
    • 顺序相同?很奇怪。
    • 添加了 sys.path 输出
    【解决方案2】:

    找到了解决办法!

    基本上我需要为出现在错误中的每个 dylib 创建符号链接,示例如下:

    sudo ln -s /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/spssio/macos/libicudata48.1.dylib /usr/local/lib/libicudata48.1.dylib
    sudo ln -s /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/spssio/macos/libicui18n48.1.dylib /usr/local/lib/libicui18n48.1.dylib
    sudo ln -s /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/spssio/macos/libspssdio.dylib /usr/local/lib/libspssdio.dylib
    sudo ln -s /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/savReaderWriter/spssio/macos/libzlib123spss.dylib /usr/local/lib/libzlib123spss.dylib
    

    所以理论上来说:

    sudo ln -s /path/to/original /path/to/symbolic/link
    

    问候,

    MG

    【讨论】:

    • 我按照这种方式复制了所有6个文件,但仍然得到同样的错误!什么是潜在的解决方案?我在 IDE 和终端中都收到此错误:(
    • @Elm662 不复制。符号链接
    【解决方案3】:

    我将为这个问题添加一个答案,以使其更具普遍性。本来希望发表评论,但没有代表!虽然 Maciej 是完全正确的,他的回答帮助我找到了我的问题,但 savReaderWriter 已经更新了。从 3.4.2 版开始,现在需要复制 6 个 .dlyb 文件。

    一旦您有了文件夹的路径(路径是错误消息的位置),请确保在创建符号链接之前列出(终端窗口中的 ls)该文件夹中的所有文件。然后为每个.dylib创建符号链接

    再次感谢 Maciej 的出色回答!

    【讨论】:

      【解决方案4】:

      对于其他懒惰的人:

      ls /Users/your_user/anaconda/envs/quattro8/lib/python2.7/site-packages/savReaderWriter/spssio/macos/ | xargs -I {} sudo ln -s /Users/your_user/anaconda/envs/quattro8/lib/python2.7/site-packages/savReaderWriter/spssio/macos/{} /usr/local/lib/{}
      

      这会链接该 repo 中的所有包

      【讨论】:

        【解决方案5】:

        您还可以在 PyCharm 中指定库的路径,这样就无需创建符号链接:

        从菜单栏中单击“运行”->“编辑配置”。在左侧窗格中,选择您的 python 脚本的配置(通常 PyCharm 会为每个 .py 文件创建一个配置)。将库的路径(显示在错误消息中)插入“环境变量”。

        示例: DYLD_LIBRARY_PATH=/Users/username/miniconda3/envs/savreader/lib/python3.6/site-packages/savReaderWriter/spssio/macos;

        Screenshot of PyCharm Run Configuration

        【讨论】:

          【解决方案6】:

          升级到 Mac OS Catalina 后,将所有六个 dylib 文件复制到 /usr/local/lib/ 不再起作用(至少对我而言)。为了找出正确的目的地是什么,我做了以下事情:

          1. 打开错误堆栈树中引用的ctypes/__init__.py
          2. 添加print(os.getcwd())获取工作目录。对我来说,工作目录是/Users/Username/GitHub/myproject
          3. 由于 dylib 文件中的路径是相对于该路径 (@executable_path/../lib/),因此 dylib 文件的正确目的地是 /Users/Username/lib

          【讨论】:

            猜你喜欢
            • 2021-06-15
            • 1970-01-01
            • 1970-01-01
            • 2015-01-14
            • 2012-11-13
            • 2016-02-22
            • 1970-01-01
            • 2019-01-28
            • 1970-01-01
            相关资源
            最近更新 更多