26

pip install psycopg2在mac系统上做了一个简单的。它安装得很好,但是当我尝试使用 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刚刚好。我已经在几个 virtualenvs 上安装了 psycopg2,但这是我第一次看到这样的错误。我尝试卸载并重新安装,结果相同。请帮忙

4

10 回答 10

53

这里接受的答案是正确的(除了我认为它必须是 ln -fs ,事实上我认为如果不是(?),它甚至可能会破坏你的操作系统的稳定性)。在碰到这个并处理它之后,我只想收集这个问题的完整解决方案和另一个 lib 问题(libcrypto.1.0.0.dylib),你将在 Mountain Lion 和 Snow Leopard 上遇到 Postgres 9.*,并且也许其他系统。这也阻止了我运行 psql,它抱怨相同的两个库。

/usr/lib本质上,在libssl 和 libcrypto中需要两个更高版本的库。您可以在 Postgres lib 目录中找到这些库所需的版本。

  • 如果您是 OSX 并安装了 Postgres 的 Enterprise DB 版本,它将位于/Library/PostgreSQL/9.2/lib.
  • 对于其他安装类型的 Postgres,在 Postgress 安装目录中查找 lib 目录,例如,对于 Postgress.app,在 中找到 lib 目录/Applications/Postgres.app/Contents/MacOS/lib
  • 在某处酿造/usr/local/Cellar
  • 在 *nix 上,无论您安装在哪里。但是,如果您的发行版仅通过包管理器具有更高版本,请先查看 *nix。

首先将这两个库中最新的从 Postgres 库目录复制到/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 上胡闹。

于 2012-09-12T22:50:43.600 回答
41

为我工作:

env LDFLAGS='-L/usr/local/lib -L/usr/local/opt/openssl/lib
-L/usr/local/opt/readline/lib' pip install psycopg2

来源:无法在 Mac OS X 10.7 上的 virtualenv 中使用 pip 安装 psycopg2

于 2019-11-27T19:18:51.483 回答
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 的回答,确保-fs在使用ln命令时包含标志,这有助于确保库不会在短时间内丢失。例如,

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
于 2012-07-30T14:40:05.673 回答
4

在 OSX 10.11 上,El Capitan 报告了替换符号链接的解决方案Operation not permitted。对我有用的解决方案是使用 brew 并设置 DYLD_LIBRARY_PATH。所以:

brew install openssl

找到 openssl brew libs 的位置(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')"
于 2015-10-09T09:32:46.027 回答
2

尝试执行 syncdb Postgres 9.1 和 /psycopg2/_psycopg.so 时添加了一个进一步的错误:

库未加载:@loader_path/../lib/libcrypto.dylib 引用自:/usr/lib/libpq.5.dylib 原因:库版本不兼容:libpq.5.dylib 需要 1.0.0 或更高版本,但 libcrypto。 0.9.8.dylib 提供 0.9.8 版本

通过从以下位置复制这六 (6) 个文件来解决:

本地:/库/PostgreSQL/9.1/lib/

libssl.1.0.0.dylib

libssl.a

libssl.dylib

libcrypto.1.0.0.dylib

libcrypto.a

libcrypto.dylib

到:本地:/usr/lib

这是在 Mac OSx 10.8.1 上,在 virtualenv (1.8.2) 和 pgAdmin (1.14.3) 中有一个网络。virtualenv里面是:

姜戈==1.4

psycopg2==2.4.5

......等等......现在恢复正常。

于 2012-09-09T16:22:09.717 回答
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
于 2012-10-15T09:58:04.383 回答
1

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

于 2012-07-22T12:03:53.487 回答
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/
于 2013-12-22T09:12:16.670 回答
0

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

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

(在dyld手册页下记录)。

于 2014-12-19T18:27:22.263 回答
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):未加载库:/opt/local /lib/libssl.1.0.0.dylib

但是在“pip install postgres”之后它工作正常。根据 pip show -“postgres 是对 psycopg2 的高价值抽象”。安装时还安装了 psycopg2-binary 和 psycopg2-pool。所以,他们一起以某种方式修复了这种情况。

于 2020-02-06T10:03:15.713 回答