繁体   English   中英

python pip install psycopg2安装报错

[英]python pip install psycopg2 install error

我在 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恰到好处。 我已经在几个 virtualenvs 上安装了 psycopg2,但这是我第一次看到这样的错误。 我尝试卸载并重新安装,结果相同。 请帮忙

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

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

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

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

为我工作:

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

升级到 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

在 OSX 10.11 上,El Capitan,替换符号链接的解决方案报告Operation not permitted 对我有用的解决方案是使用 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')"

当尝试执行 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) 中有一个 web。 virtualenv 内部是:

Django==1.4

psycopg2==2.4.5

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

对我来说,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

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

对于我在 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/

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

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

(记录在dyld手册页下)。

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

导入错误: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。 所以,他们一起以某种方式修复了这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM