导入 psycopg2 库时出现错误:libssl.1.0.0.dylib 未加载。

60

当我尝试运行命令时:

import psycopg2

我遇到了这个错误:

ImportError: dlopen(/Users/gwulfs/anaconda/lib/python2.7/site-packages/psycopg2/_psycopg.so, 2): Library not loaded: libssl.1.0.0.dylib
  Referenced from: /Users/gwulfs/anaconda/lib/python2.7/site-packages/psycopg2/_psycopg.so
  Reason: image not found
到目前为止,我已经尝试了brew install openssl并参考了以下链接(但没有成功):psycopg2安装错误-库未加载:libssl.dylibPostgresapp和psycopg2在OS X上的安装Psycopg2未找到图像

4
如果您使用的是bash(OS X上的默认shell),请将以下行添加到〜/ .bash_profile中:export DYLD_FALLBACK_LIBRARY_PATH=$HOME/anaconda/lib:$DYLD_FALLBACK_LIBRARY_PATH。或者,如果您使用的是fish shell,请将以下内容添加到您的config.fish中(通常位于〜/ .config / fish / config.fish):set -x DYLD_FALLBACK_LIBRARY_PATH $HOME/anaconda/lib $DYLD_FALLBACK_LIBRARY_PATH - Answeror
2
同样的问题在这篇文章中得到了解决:https://dev59.com/N2Ag5IYBdhLWcg3wI4AR#23945292 - Xing Shi
@xing-shi是正确的!请不要搞混符号链接(在其他帖子中提到过这个问题),甚至环境变量($DYLD_FALLBACK_PATH)。请查看下面我的解决方案:https://dev59.com/-14d5IYBdhLWcg3wCOuD#36872624 - alichaudry
22个回答

77

不要在系统库目录中玩弄符号链接,而是将 $DYLD_FALLBACK_LIBRARY_PATH 设置为包含 anaconda 库的路径。例如:

export DYLD_FALLBACK_LIBRARY_PATH=$HOME/anaconda/lib/:$DYLD_FALLBACK_LIBRARY_PATH

1
这对我也起作用了!我正在使用Anaconda Python和Psycopg2在Mac OS X El Capitan上。 - mgig
1
非常感谢。在找到这个之前,在StackOverflow上至少获得了7个答案。与Anaconda和El Capitan情况相同。很高兴在删除上面的答案之前读了评论。 - Oeufcoque Penteano
1
我的Anaconda文件夹不在$HOME目录下,因此请注意导出命令需要反映Anaconda文件夹的位置。 - Seth_P
遗憾的是,出了些问题,我又回来了。这个不再起作用了(OS Sierra,Anaconda 3)。 - dwanderson
1
谢谢您的建议。我将openssl库路径添加到DYLD_FALLBACK_LIBRARY_PATH中,而不是Conda库路径(/usr/local/Cellar/openssl/1.0.2q/lib/),这解决了我的问题。 - sepideh
显示剩余4条评论

35

在 Homebrew 不允许我强制链接 openssl 后,以下方法可以正常工作:

pip install --global-option=build_ext \
            --global-option="-I/usr/local/opt/openssl/include" \
            --global-option="-L/usr/local/opt/openssl/lib" psycopg2

(这个安装在 macOS 上的 virtualenv 中成功了)


1
这是对我有效的解决方案,让pip知道我的Homebrew库所在位置。 - huyz
这对我也起作用。我正在使用通过brew安装的python和一个虚拟环境(而不是conda)。 - Steve L
一样的,对我也起作用。有没有办法将它们作为默认值包含进来,这样我就不必手动提供安装了? - TheJKFever
1
甜度。我加了“--force”在末尾。谢谢! - DonkeyKong
我在许多帖子中试了很多答案,这个就像魔法一样有效! - yshahak

30

编辑:存在潜在危险,请先阅读评论!

请参考下面更安全的解答:https://dev59.com/-14d5IYBdhLWcg3wCOuD#30726895


我遇到了完全一样的问题,在你发布一个小时后就解决了。我正在使用Mac OS X Yosemite、Python 2.7和Postgresql应用。

默认情况下似乎存在一个不工作的符号链接(或者在疑难解答期间我自己引入了它),要修复它,首先删除不正确的链接:

$ sudo rm /usr/lib/libssl.1.0.0.dylib
$ sudo rm /usr/lib/libcrypto.1.0.0.dylib

然后用以下方式重新链接它们 (将YOURUSERNAME替换为您的Mac用户名。我发现使用tab键来完成每个步骤并确认目录非常有帮助):

然后用以下方式重新链接它们 (将YOURUSERNAME替换为您的Mac用户名。我发现使用tab键来完成每个步骤并确认目录非常有帮助):

$ sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libssl.1.0.0.dylib /usr/lib
$ sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libcrypto.1.0.0.dylib /usr/lib

我相信其他的解决方案对你没有用,因为你的版本是在Anaconda中。


1
我唯一的担忧是,您现在可能会使用anaconda版本的这些库,而不是操作系统版本,即使对于不是Python或Anaconda的应用程序也是如此。 - ipaul
3
不要删除,只需移动。你可能会发现在下一步中你并没有真正想要链接的文件。 - Chris P
10
不要这样做。通过这样做,您很容易破坏您的系统。 - asmeurer
当你说“不要这样做”时,你是指MV文件而不是创建符号链接,对吗? - Dennis
2
X.L.的回答对我有用。我也会谨慎对待这个答案。 - P i

27

在经过几个小时的艰苦尝试后,这两种解决方案保证可行:

选项1。 这种方法可以解决我们的问题,无需深入研究环境变量。在你的shell中运行以下命令:

brew install --upgrade openssl
brew unlink openssl && brew link openssl --force

哇!这将升级/usr/local中关于libssllibcrypto的符号链接。现在import psycopg2可以完美地工作了。

选项2:如果您出于某种原因想要保留/usr/local中当前的符号链接,在shell中运行以下命令:

export DYLD_FALLBACK_LIBRARY_PATH=$HOME/anaconda/lib/:$DYLD_FALLBACK_LIBRARY_PATH

只需确保将上述$HOME/anaconda/lib替换为实际的库路径。在我的情况下,这是$HOME/miniconda2/envs/ali/lib

这仅适用于您当前所在的shell/bash会话。要使更改持久化,请将export语句添加到您的~/.bash_profile~/.bashrc文件中。

思路:依我之见,选项1是解决此问题的正确方法,但我保留了选项2,以防有些人喜欢使用环境变量而不是修复符号链接(例如,他们的软件依赖于旧版本的openssl文件)。


按照Brew的输出建议,我不得不将第二行更改为: - uchuugaka
brew unlink openssl && brew link --overwrite openssl --force - uchuugaka
1
尝试了解决方案1和@uchuugaka的解决方案都失败了:我使用的是OSX Sierra,当我尝试运行这些brew link命令时,会出现错误:Linking keg-only openssl means you may end up linking against the insecure [...] - dwanderson
1
Homebrew 可能有新的变化。该项目经常更新。 - uchuugaka
1
#1 选项无效 - 警告:拒绝链接:openssl 链接仅限于 keg 的 openssl 意味着您可能会在使用 Homebrew 的 openssl 标头时链接到不安全、已弃用的系统 OpenSSL。相反,请将完整的包含/库路径传递给编译器,例如: -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib - Victor G.

12

对我来说,conda install psycopg有效。它会更新以下软件包 以下软件包将被更新:

conda:      3.19.1-py27_0 --> 4.0.5-py27_0
openssl:    1.0.2f-0      --> 1.0.2g-0
pip:        8.0.2-py27_0  --> 8.1.0-py27_0
setuptools: 19.6.2-py27_0 --> 20.2.2-py27_0
wheel:      0.26.0-py27_1 --> 0.29.0-py27_0

这对我也起作用。我遇到了同样的问题,之前我使用conda pip执行了pip install psycopg2$ which pip # //anaconda/bin/pip - gmajivu

11

我在Mac上遇到了这个问题,尝试ln -s时出现了以下错误:ln: /usr/lib/libssl.1.0.0.dylib: Operation not permitted 我不想破坏我的系统。相反地,对我有效的方法是简单地安装psycopg2-binary: pip install psycopg2-binary

这将安装psycopg2-binary-2.8.3版本


8

关于X.L.上面的回答,当我已经在使用pip时,我不想使用Anaconda,所以我只是给它提供了Postgres库的路径,这对我有效(我在Mac OS 10.10上使用PostgreSQL.app)...

export DYLD_FALLBACK_LIBRARY_PATH=/Library/PostgreSQL/9.5/lib:$DYLD_FALLBACK_LIBRARY_PATH

4

我需要稍微修改Scott Brennstuhl的回答: 1. 删除损坏的符号链接:

$ sudo rm /usr/lib/libssl.1.0.0.dylib
$ sudo rm /usr/lib/libcrypto.1.0.0.dylib
$ sudo rm /usr/lib/libpq.5.dylib

重新链接使用 postgres 包含的驱动程序:
$ sudo ln -s   /Applications/Postgres.app/Contents/Versions/9.4/lib/libssl.1.0.0.dylib /usr/lib    
$ sudo ln -s /Applications/Postgres.app/Contents/Versions/9.4/lib/libcrypto.1.0.0.dylib /usr/lib
$ sudo ln -s /Applications/Postgres.app/Contents/Versions/9.4/lib/libpq.5.dylib  /usr/lib

4

我的设置与原帖有些不同:我在Mac上使用Postgres.app并且在一个virtualenv中。但是,我的症状与原贴类似。

对我来说,在将本地的Postgres.app从9.3更新到9.5后,就出现了这个问题,错误明显显示psycopg2路径的libssl.1.0.0.dylib指向旧的9.3数据目录位置(这个错误中提到的image?)。向我的ENV添加奇怪的东西或删除符号链接,我不确定其影响是否正确。我通过卸载然后重新安装psycopg2来解决问题,方式与它之前工作时相同 - 这样做感觉并不危险:

 # In my virtualenv
 pip uninstall psycopg2
 pip install psycopg2

然后我一切都好了!


清理了pip缓存(pip cache purge)后,对我有用——缓存中的构建版本仍然指向旧的libssl路径。 - tmuguet

3

若你的 /usr/local/Cellar 目录下有 OpenSSL,可按照以下步骤解决 Library not loaded:libssl.1.0.0.dylib 错误:

  1. sudo cp /usr/local/Cellar/openssl/<<version>>/lib/libssl.1.0.0.dylib /usr/lib

  2. 如果在执行第一步后仍然出现 Library not loaded:libcrypto.1.0.0.dylib 错误,则执行以下操作:
        sudo cp /usr/local/Cellar/openssl/<<version>>/lib/libcrypto.1.0.0.dylib /usr/lib


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