Psycopg2库未找到图片。

83

尝试使用postgres mac应用程序设置postgres,但遇到了这个错误,我还没有解决。有什么想法吗?

    ImportError: dlopen(/Users/Craig/pyenv/mysite/lib/python2.7/site-packages/psycopg2/_psycopg.so, 2): Library not loaded: @executable_path/../lib/libssl.1.0.0.dylib
  Referenced from: /Applications/Postgres.app/Contents/MacOS/lib/libpq.dylib
  Reason: image not found
23个回答

90
$ sudo ln -s /Library/PostgreSQL/9.2/lib/libssl.1.0.0.dylib /usr/lib
$ sudo ln -s /Library/PostgreSQL/9.2/lib/libcrypto.1.0.0.dylib /usr/lib

在我使用Django时遇到了这个错误。 我已经在使用Django==1.3的virtualenv上运行它,但是在Django==1.5上却不行,我必须发出上面的命令。

在OS X El Capitan中,如果你不禁用系统保护,你不能做这些链接,但是如果链接到/usr/local/lib,它可以很好地工作。


2
这个答案是唯一一个对我有用且不会破坏其他系统(如Mercurial等)的。看起来这是一个已知的问题:https://github.com/PostgresApp/PostgresApp/issues/109#issuecomment-18387546 - Luke Hoersten
12
如果你使用Heroku的Postgres.app,可以尝试以下命令: sudo ln -s /Applications/Postgres.app/Contents/MacOS/lib/libssl.1.0.0.dylib /usr/lib sudo ln -s /Applications/Postgres.app/Contents/MacOS/lib/libcrypto.1.0.0.dylib /usr/lib这些命令可以帮助您解决一些可能遇到的问题。请注意不要改变命令的原意。 - s29
11
我把符号链接创建到 /usr/local/lib 目录,因为这样感觉更安全,不太可能与系统发生冲突,比 /usr/lib 目录更可靠。效果一样好。 - Joe Shaw
5
如果你不使用@JoeShaw在OS X El Capitan下的注释,将会出现“ln:/usr/lib/libssl.1.0.0.dylib:操作不允许”的错误。这是由于"rootless"模式导致的。更多信息请参见此处:http://apple.stackexchange.com/questions/196224/unix-ln-s-command-not-permitted-in-osx-el-capitan-beta3 - Tyler Hayes
2
可以确认 sudo ln -s /Applications/Postgres.app/Contents/Versions/9.5/lib/libcrypto.1.0.0.dylib /usr/local/lib; sudo ln -s /Applications/Postgres.app/Contents/Versions/9.5/lib/libssl.1.0.0.dylib /usr/local/lib 可以用于 9.5 版本的 Postgres.app。 - lollercoaster
显示剩余3条评论

51
pip install psycopg2-binary

非常好用!

关于源码+wheel分发(pyscopg2)与独立的二进制分发(psycopg2-binary)的讨论:https://www.postgresql.org/message-id/CA%2Bmi_8bd6kJHLTGkuyHSnqcgDrJ1uHgQWvXCKQFD3tPQBUa2Bw%40mail.gmail.com

关于发布psycopg2-binary决定的解释:http://initd.org/psycopg/articles/2018/02/08/psycopg-274-released/

然而,有报告称psycopg2-binary未满足psycopg2的依赖关系,更多讨论请参考:https://github.com/psycopg/psycopg2/issues/674


2
当回答一个已有答案的旧问题时,解释你的答案与现有答案的区别是很有用的。对于非常老的问题,指出答案是否依赖于软件的新版本也是很有用的。 - Jason Aller

18
我在处理类似rails问题时,找到了一个对我有效的解决方案。请将以下内容添加到您的 .bash_profile、.bash_rc 或等价文件中:
export DYLD_FALLBACK_LIBRARY_PATH=/Applications/Postgres.app/Contents/MacOS/lib:$DYLD_LIBRARY_PATH

假设您已将Postgres.app安装在默认位置。然后重新启动终端会话并重试。

直接导出到DYLD_LIBRARY_PATH可能会对依赖它的其他应用程序造成严重问题,但使用后备路径可以避免这些问题。

另请参阅:https://github.com/PostgresApp/PostgresApp/issues/109#issuecomment-18387546

编辑:似乎设置DYLD_FALLBACK_LIBRARY_PATH会在尝试运行psql时导致错误。为修复此问题,您可以在.bash_profile中添加以下两行:

alias psql="(. ~/.bash_profile; unset DYLD_FALLBACK_LIBRARY_PATH; psql)";

假设您使用的是bash,并且您的.bash_profile位于您的主目录中。如果不是这种情况(或者如果您使用的是.bashrc或其他环境设置而不是.bash_profile),请将命令中的~/.bash_profile更改为环境设置脚本的路径。
别名命令基本上启动一个子shell,不会影响您当前的bash环境。因此,当它取消设置DYLD_FALLBACK_LIBRARY_PATH变量时,它只是暂时性的。在退出psql后,环境变量将再次设置。

虚拟环境的小调整;我在我的 postactivate 中添加了这一行:export "DYLD_FALLBACK_LIBRARY_PATH=/Library/PostgreSQL/9.4/lib:$DYLD_LIBRARY_PATH",并且在安装时使用了这个命令:DYLD_LIBRARY_PATH=/Library/PostgreSQL/9.4/lib pip install psycopg2 - shapiromatron

17

在我升级Postgresql,并在我的virtualenv中安装psycopg2后,这种情况发生了。重新安装(重新构建)对我有用。

pip uninstall psycopg2
pip install psycopg2

在我的电脑上,将postgresql.app版本从9.3升级到9.5后,在OS X El Capitan 10.11.3上运行正常。 - Bob Jordan
我在从Postgres 9.6升级到12.1后尝试了这个方法,它对我非常有效。谢谢! - allardbrain
清理了pip缓存(pip cache purge)后,对我有用——缓存中的构建版本仍然指向旧的libssl路径。 - tmuguet

11
这个问题花费了我整个早晨的时间才解决。我在http://initd.org/psycopg/articles/2010/11/11/links-about-building-psycopg-mac-os-x/上找到了有关讨论,对我非常有帮助。感谢Jurie的回答,对于我的问题(在Mac上),解决方案如下:

  1. 使用brew安装openssl 1.0.0:

     brew install openssl
    
  2. 使用以下命令:

    export DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/**1.0.1x**/lib
    

    1.0.1x部分替换为您当前的版本。 对于我来说,它是1.0.1h。

    希望这可以帮助到您!

    编辑:经过一天的尝试,我发现第二个命令必须每次连接数据库时都输入,因此不是该问题的永久解决方案。


在执行命令时设置DYLD_LIBRARY_PATH环境变量也可以起作用:DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/1.0.2d_1/lib/ python manage.py migrate - markonovak
export DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/**1.0.1x**/lib添加到您的环境激活脚本中(例如:~/anaconda3/envs/myenv/bin/activate)。 - maxbellec
1
你还可以将命令添加到 ~/.bash_profile 中,这样每次都不需要再次输入,它就会自动工作。 - Petros Kyriakou
@PetrosKyriakou,这会导致ssl导入失败,正如此问题所示:https://groups.google.com/a/continuum.io/forum/#!topic/anaconda/mVvbFVFyUjE - jdeng

10

在你加载bash环境之前,尝试执行以下操作:

export DYLD_LIBRARY_PATH=/Library/PostgreSQL/x.y/lib

用您系统上的版本替换 'x.y'。

请注意,在您的bash配置文件中设置此变量可能会干扰其他程序,就像KindOfGuy所指出的那样。

当然,如果您不是从bash提示符运行它,您将不得不以pyenv允许的任何方式设置您的环境。您甚至可以编辑pyenv本身并将其放置在顶部。

另一种选择是将此代码放入一个python脚本中,在尝试导入psycopg2之前运行该脚本:

import os
os.environ['DYLD_LIBRARY_PATH'] = '/Library/PostgreSQL/x.y/lib'

..再次替换'/Library/PostgreSQL'中与您系统版本相符的'x.y'。


虽然我检查了/Library/PostgreSQL/9.2/文件夹,但唯一的项目是一个名为"data"的锁定文件夹。我想应该还有其他项目,对吗? - Craig Cannon
2
从bash配置文件运行导出操作在其他地方引起了麻烦,但我将os.environ['DYLD_LIBRARY_PATH'] = '/Library/PostgreSQL/x.y/lib'插入到manage.py中,这很有效。虽然仍需要在所有项目中执行此操作,但这将帮助我解决问题,直到找到其他解决方法。 - KindOfGuy
代表 ctbailey :*这是 Postgres.app 9.3 版本的更新路径:export DYLD_FALLBACK_LIBRARY_PATH=/Applications/Postgres.app/Contents/Versions/9.3/lib:$DYLD_LIBRARY_PATH*。 - user2629998

7

当我将postgres.app从9.4升级到el capitan上的9.5时,遇到了这个问题。

其他解决方案在el capitan中不会(轻易地)起作用,因为系统锁定了某些目录,这意味着符号链接解决方案对大多数人来说不太容易/理想。

这只留下了备选变量。当前答案指向错误的目录。我猜自2013年以来dylibs目录已经改变了。

所以,这是最新的适用于我的后备目录:

export DYLD_FALLBACK_LIBRARY_PATH=/Applications/Postgres.app/Contents/Versions/latest/lib:$DYLD_LIBRARY_PATH

1
谢谢!与问题中类似的问题让我极为苦恼,但是在DYLD_FALLBACK_LIBRARY_PATH前添加Postgres的“lib”就解决了问题。 - user554546

4
在Mac OS X 10.11(El Capitan)中,/usr/lib 只有root用户才能读写。 你将会遇到一个错误:ln: /usr/lib/libssl.1.0.0.dylib: Operation not permitted error 需要使用 /usr/local/lib 替代 /usr
$ sudo ln -s /Library/PostgreSQL/9.2/lib/libssl.1.0.0.dylib /usr/local/lib
$ sudo ln -s /Library/PostgreSQL/9.2/lib/libcrypto.1.0.0.dylib /usr/local/lib

4

我遇到了类似的问题,我使用 macOS 执行 pip install psycopg2-binary ,对我非常有帮助 :)


3
大致情况是需要找到一个必需的库,但未能找到。您可以使用苹果的开源编译器工具otoolinstall_name_tool更改psycopg2查找libssl的位置。这些工具随OS X一起提供,并且手册页面可通过man <command>进行查看。
进入错误消息中提到的psycopg2模块目录并进行更改:
$ otool -L _psycopg.so
    ...
    @executable_path/../lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
    ...

这里列出了_psycopg2.so将要查找的库文件。您可以使用install_name_tool更改它查找的位置:
$ install_name_tool -change @executable_path/../lib/libssl.1.0.0.dylib /usr/local/opt/openssl/lib/libssl.1.0.0.dylib _psycopg.so

您需要根据实际情况调整libssl.1.0.0.dylib的位置。我给出的示例是Homebrew的默认路径,但您可能已经从Anaconda和/或PostgreSQL应用程序捆绑包中获得它。(如果尚未安装,请运行brew install openssl)您还可能需要为libcrypto重复此操作。
执行此更改可能会因构建_psycopg2.so的方式而失败。如果发生这种情况,您可能可以使用自定义库路径自己构建模块,但我不会详细介绍这个过程。
这种方法的优点是比将libssl 1.0.0链接到dyld搜索路径(通过ln -s或设置DYLD_*环境变量)的方法更窄,因此风险更小(参见一对 讨论某些代码中对这些方法的警告)。通过man dyld了解有关dyld的更多信息。缺点是需要为每个psycopg2副本重复此过程。选择自己的冒险。

免责声明:本回答中的大部分内容都是我在一天内汇集而来的知识。我不是专家。


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