库(dylib)未加载 - 找不到图像 - Python IDE

4

基本上,我正在尝试运行来自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

6个回答

5

找到解决方案了!

基本上,我需要为出现错误的每个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
@Elm662 不复制。symlink - dan-klasson

4
我会为这个问题添加一个答案,以使其更具有普适性。我本来想发表评论的,但是没有足够的声望!虽然Maciej完全正确,他的回答帮助我找到了我的问题,但savReaderWriter已经更新。从版本3.4.2开始,现在有6个.dlyb文件需要复制。
一旦您获得了指向文件夹的路径(路径是您的错误消息的位置),请确保在创建符号链接之前列出该文件夹中的所有文件(在终端窗口中使用“ls”命令)。然后为每个.dylib创建符号链接。
再次感谢Maciej提供的好答案!

2

对于其他懒人:

最初的回答:

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/{}

This links all packages in that repo


1
你还可以在PyCharm中指定库的路径,这样就不需要创建符号链接了:
从菜单栏中点击“运行”->“编辑配置”。在左侧窗格中选择您的Python脚本的配置(通常PyCharm为每个.py文件创建一个配置)。将库的路径(在错误消息中显示)插入到“环境变量”中。

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

PyCharm 运行配置截图


1
升级到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

0

我不是Mac用户,但你真的在使用Python 3.6吗?savReaderWriter支持那个版本吗?我怀疑它使用的I/o模块是否适用于那个版本。

如果这在终端上可以工作但在IDE上不行,请检查Python搜索路径是否相同。


虽然它不支持v3.6,但至少在终端中对我来说是可以工作的。所有出现在终端中的搜索路径也会出现在IDE中。 - Maciej Gaca
同样的顺序?奇怪。 - JKP
添加了sys.path输出 - Maciej Gaca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接