Python pip安装psycopg2时出现错误。

26

我在 Mac 系统上执行了简单的 pip install psycopg2 命令,安装成功。但是当我尝试使用 psycopg2 时,出现以下错误:

Reason: Incompatible library version: _psycopg.so requires version 1.0.0 or later, but libssl.0.9.8.dylib provides version 0.9.8

pip freeze 显示 psycopg2==2.4.5,一切正常。我已经在几个虚拟环境中安装了 psycopg2,但这是我第一次看到此类错误。我尝试了卸载和重新安装,但结果相同。请帮忙解决。


更新你的发行版。你需要更新更新的“libssl”。 - b1_
libssl默认由Postgres安装。我正在使用9.1版本。 - jerrymouse
otool -L <packName> 说了什么? - b1_
10个回答

53
这里的被接受的答案是正确的(除了我认为它必须是 ln -fs ,事实上,如果不这样做,甚至可能危及您的操作系统(?))。在遇到这个问题并进行处理后,我只想收集解决此问题以及在 Mountain Lion 和 Snow Leopard 上运行 Postgres 9.* 时会遇到的其他 lib 问题(libcrypto.1.0.0.dylib),以及其他系统。这也使我无法运行 psql,因为它抱怨了相同的两个 libs。
基本上需要两个较新版本的 libs 在 /usr/lib 中,即 libssl 和 libcrypto。您可以在 Postgres lib 目录中找到这些 libs 的所需版本。
- 如果您使用的是OSX并安装了Enterprise DB版本的Postgres,则位于/Library/PostgreSQL/9.2/lib中。 - 对于其他类型的Postgres安装,请查找Postgress安装目录内的lib目录,例如对于Postgress.app,请找到 /Applications/Postgres.app/Contents/MacOS/lib 中的lib目录, - 对于brew,可能在 /usr/local/Cellar 中的某个地方, - 在*nix上,无论您的安装在哪里。但是首先在*nix上查看您的发行版是否通过软件包管理器具有更高版本。
首先从Postgres lib目录中复制这两个 libs 的最新版本到 /usr/lib 中:
sudo cp /Library/PostgreSQL/9.2/lib/libssl.1.0.0.dylib /usr/lib
sudo cp /Library/PostgreSQL/9.2/lib/libcrypto.1.0.0.dylib /usr/lib

然后更新(或创建)这些库的 /usr/lib 符号链接。无论哪种方式,命令都是 ln -fs

sudo ln -fs /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib
sudo ln -fs /usr/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib

应该被修复。相当确定ln -fs比删除符号链接并重新制作它更好,因此在libssl在一段时间内不可用时,需要它的某些东西找不到它的机会较小(它执行相同的操作;如果已经存在符号链接,则首先删除符号链接,只比您打字快)。总是小心在/usr/lib上胡闹。


+1 @purrell。在提出这个问题的时候,周围并没有太多的解决方案,所以我在SO上发了一个帖子。虽然很不幸,但很高兴看到其他人分享他们的解决方案。感谢详细的解释,将会帮助许多人。干杯! - jerrymouse
谢谢,这对我有用。但我不明白的是,为什么在另一个虚拟环境中,使用完全相同的软件包版本,一周前我没有遇到这个问题(这也是OP所建议的)? - John Peters
这同样适用于OS X 10.9(Mavericks)。谢谢! - ᴠɪɴᴄᴇɴᴛ
这似乎完全破坏了我的Chrome浏览器。(Google Chrome v35.0.1916.153,Mac OS X 10.7.5) “Dyld错误消息:库未加载:/usr/lib/libcrypto.0.9.8.dylib,原因:找不到合适的映像。找到了:/usr/lib/libcrypto.0.9.8.dylib:mach-o,但是架构错误。”Safari也无法加载https,并显示错误:“com.apple.mdworker:/usr/lib/libcrypto.0.9.8.dylib:mach-o,但是架构错误”。 - Adam Greenhall

42

1
LDFLAGS='-L/usr/local/lib -L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib' pip install psycopg2 解决了我的问题。谢谢 - MA1
对我有用。谢谢! - ankit tyagi
对我也起作用了,不过在运行之前我使用brew安装了postgresql@9.5。谢谢 :) - Bhavya Jain

24

我升级到Mountain Lion后遇到了类似的问题。

根据Slack的建议,不要复制libssl.*文件,而是确保/usr/lib/libssl.dylib实际上是软链接到库的最新版本。

例如,在我的机器上,ls -l /usr/lib/libssl*会给出:

lrwxr-xr-x  1 root  wheel    46B Jun 27 15:24 /usr/lib/libssl.1.0.0.dylib -> /Library/PostgreSQL/9.1/lib/libssl.1.0.0.dylib
lrwxr-xr-x  1 root  wheel    27B Jul 30 10:31 /usr/lib/libssl.dylib -> /usr/lib/libssl.1.0.0.dylib
如果libssl.dylib没有链接到错误版本所提到的版本,请确保您拥有该版本的库,然后确保/usr/lib/libssl.dylib指向该版本,而不是旧版本。
如果链接不存在,请按以下方式创建它。
sudo ln -s library_to_link_to link_to_create

当然要使用适合您的机器的正确位置。对于我来说,这个位置是:

sudo ln -s /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib

编辑:

看起来一些人在使用我的解决方案时遇到了麻烦。特别是,即使是暂时删除这些重要的库,也会导致操作系统出现问题。

根据Purrell的答案,确保在使用ln命令时包含-fs标志,这有助于确保库不会在短时间内消失。例如,

sudo ln -fs /usr/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib
sudo ln -fs /usr/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib

1
运行良好,警告当涉及到这些文件时要小心,我曾经犯过一个错误,导致整个操作系统崩溃。 - bosco-
1
@bosco 是的,我也遇到了同样的问题。我当时正在这个帖子上,结果搞糟了操作系统(雪豹版,后来用山狮升级USB修复)。对于其他人来说,我认为你需要 ln -fs ... 不要先删除符号链接。我不太明白为什么会出现这种情况。我想可能是某些进程在使用库文件时被删除了?也许删除和重新链接库文件就像俄罗斯轮盘赌一样。如果有人知道更多,请解释一下。 - Purrell

4

在OSX 10.11 El Capitan上,替换符号链接的解决方案报告了操作不允许的错误。对我有效的解决方案是使用brew并设置DYLD_LIBRARY_PATH。所以:

brew install openssl

查找openssl brew库的位置(brew --prefix openssl可以帮助),从目录/usr/local/Cellar/openssl开始搜索。在我的情况下,它位于/usr/local/Cellar/openssl/1.0.2d_1/lib

最后设置DYLD_LIBRARY_PATH,即在.bash_profile中添加一行类似于这样的内容:

# replace location of lib files with folder name you found in previous step
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/Cellar/openssl/1.0.2d_1/lib

更新:更通用/更好的替代方法是(感谢@dfrankow):

  • 使用brew查找openssl位置(注意,brew可能会很慢):DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$(brew --prefix openssl)/lib
  • 为开发目的,也许最好使用DYLD_FALLBACK_LIBRARY_PATH - 参见这里

重新启动shell,或者只需source ~/.bash_profile,重新安装psycopg2:

pip uninstall psycopg2
pip install psycopg2

并测试它是否有效:

$ python -c"import psycopg2  ;   print('psycopg2 is now ok')"

1
你还可以尝试更通用的方法:export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$(brew --prefix openssl)/lib。而且,你也可以使用DYLD_FALLBACK_LIBRARY_PATH来避免与DYLD_LIBRARY_PATH冲突。 - dfrankow
LDFLAGS="-L$(brew --prefix openssl)/lib" pip install psycopg2 - drtf

2

对于我来说,libcryto和libss版本1.0.0位于以下位置:

/Library/PostgreSQL/9.1/lib/libcrypto.1.0.0.dylib
/Library/PostgreSQL/9.1/lib/libssl.1.0.0.dylib

因此,解决我的问题的命令是:

sudo ln -fs /Library/PostgreSQL/9.1/lib/libssl.1.0.0.dylib /usr/lib/libssl.dylib
sudo ln -fs /Library/PostgreSQL/9.1/lib/libcrypto.1.0.0.dylib /usr/lib/libcrypto.dylib

2
在尝试进行syncdb时,Postgres 9.1和/psycopg2/_psycopg.so出现了另一个错误:
错误信息:
Library not loaded: @loader_path/../lib/libcrypto.dylib
Referenced from: /usr/lib/libpq.5.dylib
Reason: Incompatible library version: libpq.5.dylib requires version 1.0.0 or later, but libcrypto.0.9.8.dylib provides version 0.9.8
通过将以下六(6)个文件从LOCAL:/Library/PostgreSQL/9.1/lib/复制到LOCAL:/usr/lib来解决问题:
需要复制的文件:
libssl.1.0.0.dylib
libssl.a
libssl.dylib
libcrypto.1.0.0.dylib
libcrypto.a
libcrypto.dylib
这是在Mac OSx 10.8.1上使用virtualenv(1.8.2)和pgAdmin(1.14.3)的Web应用程序中,虚拟环境中安装了Django==1.4和psycopg2==2.4.5等等,现在已恢复正常。

1

朋友,只需将PostgreSQL lib目录中的libssl.*文件复制到/usr/lib,并重新启动您的应用程序,在这种情况下所有事情都将完美 ^_^


这对我有用,谢谢!供参考,在OSX 10.8上,Slack所指的PostgreSQL lib目录是/Library/PostgreSQL/9.1/lib/ - RyanB
这实际上不能解决问题。符号链接也需要更改。 - Purrell

0

我在我的Mac OS High Sierra上遇到了类似的问题。

ImportError: dlopen(/Users/chicha/Projects/CTMR/sample_registration/romans_env/lib/python3.7/site-packages/psycopg2/_psycopg.cpython-37m-darwin.so, 2): Library not loaded: /opt/local/lib/libssl.1.0.0.dylib

但是在执行 "pip install postgres" 后,问题得到了解决。 根据 pip show 的信息 - "postgres 是对 psycopg2 的高价值抽象"。 在安装时,它还安装了 psycopg2-binary 和 psycopg2-pool。 所以,它们一起修复了这个问题。


0

如果您不想将库文件复制到系统目录中,可以使用DYLD_LIBRARY_PATH环境变量来强制操作系统在Postgres的库目录中搜索libssl。例如:

$ DYLD_LIBRARY_PATH=/Library/PostgreSQL/9.4/lib pip install psycopg2

(记录在dyld手册下)

0

对于我在Mavericks上,只需复制这两个dylib并重新启动Python即可:

cp /Library/PostgreSQL/9.3/lib/libssl.1.0.0.dylib /usr/lib/
cp /Library/PostgreSQL/9.3/lib/libcrypto.1.0.0.dylib /usr/lib/

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