找不到Psycopg2图像


71

尝试使用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

Answers:


88
$ 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
这个答案是唯一一个为我工作的是没有搞砸像水银等系统等。像它看起来是一个已知的问题:github.com/PostgresApp/PostgresApp/issues/...
卢克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 2013年

11
/usr/local/lib之所以将它们符号链接进来,是因为它感觉比Windows更安全,并且不太可能使系统混乱/usr/lib。效果也一样。
Joe Shaw

5
@JoeShaw的评论在OS X El Capitan中是必需的。ln: /usr/lib/libssl.1.0.0.dylib: Operation not permitted否则,您会得到一个错误。这是由于“无根”模式。此处的更多信息:apple.stackexchange.com/questions/196224/…–
泰勒·海斯

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/lib9.5 Postgres.app的作品
lollercoaster

30
pip install psycopg2-binary

奇迹般有效!

关于源+轮分布(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


1
用现有答案回答较旧的问题时,解释与现有答案有何区别是很有用的。对于非常老的问题,指出答案是否依赖于软件的较新版本也很有用。
詹森·艾勒

18

我找到了一个解决类似铁路问题的解决方案。将以下内容添加到您的.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

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

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

假设您正在使用bash,并且.bash_profile位于主目录中。如果不是这种情况(或者您使用的是.bashrc或其他环境设置而不是.bash_profile)~/.bash_profile,请将命令部分更改为环境设置脚本的路径。

别名命令基本上会启动一个不会影响当前bash环境的子shell。因此,当它取消设置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

16

在升级Postgresql之后,并在我的virtualenv中安装了psycopg2之后,这发生在我身上。重新安装(重建)对我有用。

pip uninstall psycopg2
pip install psycopg2

在OS X El Capitan 10.11.3上将postgresql.app版本9.3升级到9.5后,这对我有用。
鲍勃·乔丹

从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
migration

添加export DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/**1.0.1x**/lib到您的环境中激活脚本(例如〜/ anaconda3 / envs / myenv / bin / activate)
maxbellec

1
您也可以在其中添加命令,该命令~/.bash_profile每次都可以运行,而不必一次又一次输入
佩特罗斯KYRIAKOU

@PetrosKyriakou,这将导致ssl导入失败,如从以下问题中可以看出:groups.google.com/a/continuum.io/forum
#!topic/anaconda/…

10

在您的bash环境中,在加载之前,请尝试以下操作:

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

..用系统上的版本替换“ xy”。

..请注意,如KindOfGuy所述,在bash个人资料中设置此设置可能会干扰其他程序。

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

另一个替代方法是将其放入在尝试导入psycopg2之前运行的python脚本中:

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

再次..,用/ Library / PostgreSQL中系统上的版本替换'xy'。


没什么...虽然我检出了该文件夹/Library/PostgreSQL/9.2/,但其中唯一的项目是一个名为“ data”的锁定文件夹。我想应该还有其他物品吧?
克雷格·坎农

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

7

我在capitan上从postgres.app 9.4升级到9.5时遇到了这个问题。

由于某些目录上的系统锁定,其他解决方案无法(轻松)在cap capan中工作,这意味着符号链接解决方案在大多数情况下将较难访问/理想。

留下后备变量。当前答案指向错误的目录。我猜想dylibs目录自2013年以来已更改。

因此,这是适用于我的最新后备目录:

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

1
谢谢!与此问题类似的问题是让我绝对痴迷,但以Postgreslib为先DYLD_FALLBACK_LIBRARY_PATH

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

3

大图,问题在于找不到所需的库。您可以更改其中psycopg2的外观为libssl使用苹果的开源编译工具otoolinstall_name_tool。这些随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_*环境变量)的方法(在此处提供其他答案)相比,这种方法的优点是更窄,因此风险更低。(见警告反对这些在接近一双讨论一些代码。了解更多关于dyld通过man dyld)。它需要被重复的每个副本的缺点psycopg2。选择自己的冒险。

免责声明:此答案中的大部分内容来自于我在一天内拼凑而成的知识。我不是专家。


2

我缺少了postgresql客户端软件包,所以我用brew安装了它们,并为我解决了这个问题。

brew update
brew doctor
brew install postgresql

2

由于将Postgres.app(从9.3升级到9.4),我遇到了相同的错误。

解决方案是删除pip缓存轮,因为它们指向的是Postgres.app版本9.3。

我已经找到了相应的psycopg轮缓存文件

grep -r psycopg ~/.pip/cache

并删除上一条命令找到的目录。


2

我找到了对我有用的解决方案

sudo cp /Applications/Postgres.app/Contents/Versions/9.3/lib/libssl.1.0.0.dylib /usr/lib
sudo ln -fs /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib 

sudo cp /Applications/Postgres.app/Contents/Versions/9.3/lib/libcrypto.1.0.0.dylib /usr/lib
sudo ln -fs /usr/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib 

根据在计算机上安装psql的位置,替换此部分'/Applications/Postgres.app/Contents/Versions/9.3/'。查找psql的安装位置的命令:which psql

注释更新:在OSX 10.11(El Capitan)上,您不能再将文件复制到/ usr / lib。使用/ usr / local / lib


回复:@MitMehta的解决方案:在OSX 10.11(El Capitan)上,您不能再将文件复制到/ usr / lib。使用/ usr / local / lib。
someguyinafloppyhat

为什么不使用Postgres.app中可用的“最新”符号链接并将其复制到/ usr / lib和/ usr / local / lib中,例如:sudo ln -sf /Applications/Postgres.app/Contents/Versions/latest/lib/libssl .dylib {/ usr / lib,/ usr / local / lib}; sudo ln -sf /Applications/Postgres.app/Contents/Versions/latest/lib/libcrypto.dylib {/ usr / lib,/ usr / local / lib}
Jamie Ivanov

2

如果您正在使用虚拟环境处理python / django

为我工作了以下版本

  • MacOS卡塔利娜10.5.2
  • python 3.7.3
  • 的Django 3.0.2
  • psycopg2 == 2.8.4
  • virtualenv 16.6.0
  • 点19.3.1
  • postgres(PostgreSQL)11.2

3步解决方案

  • 删除现有的虚拟环境
  • 再次创建新的虚拟环境
  • 再次安装依赖项

1

对我有用的解决方案是使用“ no-binary”选项集安装psycopg2,该命令告诉psycopg2使用系统libssl。

默认情况下,psycopg2使用自己的libssl版本,并且似乎依赖于该库的旧版本,该旧版本在升级后不再存在。

有关no-binary选项的更多详细信息,请参见psycopg2安装文档

pip uninstall psycopg2
pip install --no-binary :all: psycopg2

0

您安装了psycopg2吗?您需要它以便将python与postgresql集成。


是的,它已安装。我正在运行pyenv,会影响一切吗?
克雷格·坎农

0

我在mysql中遇到类似的问题。请求的库无法加载/usr/local/mysql/lib/libmysqlclient_r.16.dylib

但是,在此目录中,有一个更高版本的库: /usr/local/mysql/lib/libmysqlclient.20.dylib

我在virtualenvwrapper中工作,并尝试重新安装所有以前安装的依赖项,但无济于事。任何帮助将不胜感激。


0

只是想分享对我有用的东西。我在用Jupyter使用Anaconda。以下工作:

 DYLD_LIBRARY_PATH=/usr/local/Cellar/openssl/1.0.2k/lib  jupyter notebook

但是后来导致了导入另一个库的问题(密谋)。在玩完pip之后,我意识到我可能应该改用conda,以下内容似乎可以解决所有问题。

conda install psycopg2

0

尝试psycopg2使用更新pip install psycopg2 --upgrade到最新版本,然后重试。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.