Psycopg2安装错误 - 库未加载:libssl.dylib

44

我试图在virtualenv中使用pip安装psycopg2,编译看起来没问题,它说“成功安装了psycopg2”,但当我尝试在Python解释器(在virtualenv中)导入它时,它会提示错误:

  File "<stdin>", line 1, in <module>
  File "/Users/me/sites/env/trackmap/lib/python2.7/site-packages/psycopg2/__init__.py", line 67, in <module>
    from psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
ImportError: dlopen(/Users/me/sites/env/trackmap/lib/python2.7/site-packages/psycopg2/_psycopg.so, 2): Library not loaded: libssl.dylib
  Referenced from: /Users/me/sites/env/trackmap/lib/python2.7/site-packages/psycopg2/_psycopg.so
  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成功安装过它,大约几周前,并且与我的Mac上的postgresql一起工作。我想知道这是否是编译器的问题?我在安装psycopg2时看到了一些警告,如“从64位缩短到32位”。我的编译器是i686-apple-darwin11-llvm-gcc-4.2,在Mac OS X Lion上是默认的。
我看到了几篇相关于psycopg2安装的帖子,但是大多数都通过在虚拟环境中安装来解决。那么...有人能给我建议吗?非常感谢。
附注:如果您需要安装psycopg2的编译日志,请告诉我,我没有将其粘贴在此处,因为它太长。
10个回答

102

这个错误是说libssl.dylib的版本太老了吗?

在我的Mac上,错误是因为libssl.dyliblibcrypto.dylib版本过旧,不能被pyscopg使用。Mac使用的openssl软件包版本是0.98,而pyscopg需要1.0.0或更高版本。

我的解决方案如下:

  1. 从brew安装openssl

$ brew install openssl
  • /usr/local/Cellar/openssl/1.0.1c 中的 libssl.1.0.0.dyliblibcrypto.1.0.0.dylib 复制到 /usr/lib/ 中。

  • $ cd /usr/local/Cellar/openssl/1.0.1c/lib
    $ sudo cp libssl.1.0.0.dylib libcrypto.1.0.0.dylib /usr/lib/
    
    /usr/lib 目录中创建软链接 libssl.dyliblibcrypto.dylib。您可能需要删除现有的链接。
    $ sudo rm libssl.dylib libcrypto.dylib
    $ sudo ln -s libssl.1.0.0.dylib libssl.dylib
    $ sudo ln -s libcrypto.1.0.0.dylib libcrypto.dylib
    

    3
    来自https://dev59.com/2Ggu5IYBdhLWcg3wJT5I的FYI - "根据Purrell的回答,使用ln命令时确保包括-fs标志,这有助于确保库不会在短时间内丢失。" - Matthew Cornell
    1
    谢谢您!我遇到了链接错误,但与PostgreSQL完全无关,花了我很长时间才找到一个简单的解决方案。 - smessing
    在这个链接中,步骤已经很好地解释了:http://mithun.co/hacks/library-not-loaded-libcrypto-1-0-0-dylib-issue-in-mac/ - Samar Panda
    只是一点提示:我有 openssl/1.0.2h_1/,但我需要移动的文件仍然是 libssl.1.0.0.dyliblibcrypto.1.0.0.dylib。一切都很顺利,尽管我还需要 sudo 权限的帮助 - dwanderson
    这个怎么样?http://initd.org/psycopg/docs/install.html#binary-install-from-pypi - Ajay Rawat
    4
    在最近的 MacOS 版本中,/usr/lib 受到 SIP 保护。按照使用 /usr/local/lib 的指示对我很有用。 - Aneel

    56

    我认为在Mac上我们需要:

    export LDFLAGS="-L/usr/local/opt/openssl/lib"
    

    在 m1 上:

    export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib"
    

    1
    很棒的答案。解决了构建问题。 - ricosrealm
    1
    这个在MacOS Big Sur 11.0.1上运行良好。 - Shift 'n Tab
    在 Mac 11 上,这个答案可以解决问题。不确定,但在安装 psycopg2 之前可能需要先安装 postgres sql。 - Abhishek Rathore
    这应该是被接受的答案。不涉及干扰系统libssl或安装额外文件。注意:这假定您已经使用Homebrew安装了更新版本的openssl。 - Patrick
    2
    如果您使用的是带有M1芯片的Mac,则请执行以下操作:export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib" - Oğuzhan
    谢谢,这在我的 M1 上运行,在 macOS Ventura 13.2.1 上也是如此。 - ghgg

    25

    我遇到了类似的问题。我使用Anaconda安装了Python和一些包,然后稍后使用pip安装了psycopg2。我能够通过使用conda包管理器而不是pip卸载并重新安装psycopg2来解决错误。

    pip uninstall psycopg2
    conda install psycopg2
    

    2
    对于那些在El Captian上安装了Anaconda的人来说,这是一件非常容易的事情(感谢新的SIP)。我简直不敢相信我之前浪费了时间去尝试其他方法。 - Richard D
    我希望我们能把这个置顶。 - Jeevs
    哦,我的天啊,我无法感谢你的足够了。我试过其他方法,只有这个对我有帮助! - phanatuan
    我已经卸载了Anaconda,但是我遇到了这个错误。有没有其他的替代方案? - Happy Coder
    对我很有用!比我找到的其他所有东西都简单得多! - Josiah Coad
    尝试了其他所有方法,但这个技巧才是对我有效的。 - k88

    24

    在OSX 10.11+(El Capitan或更高版本)中,替换符号链接的解决方案(参见上面 - https://dev59.com/omgu5IYBdhLWcg3wYWFX#11911870sudo rm libssl.dylib libcrypto.dylib报告操作不允许。对我有效的解决方案如下:

    brew install openssl
    

    查找openssl的homebrew库所在位置,从目录/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
    

    重新启动 shell,或者只需source ~/.bash_profile并测试是否起作用:


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

    7
    将以下命令翻译成中文:export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$(brew --prefix openssl)/lib - Jose Alban

    13

    感谢 @khrf 的回答。

    如果您使用的是postgres系统安装程序(而不是Postgres.app),请使用:

    export DYLD_LIBRARY_PATH=/Library/PostgreSQL/9.3/lib
    
    您可以将此命令放置在您的~/.bash_profile中,这样您就可以避免每次都要键入它。

    这个解决方案对我没用。相反,我尝试将以下内容放置到 ~/.bash_profile 中:export DYLD_FALLBACK_LIBRARY_PATH=/Library/PostgreSQL/9.4/lib:$DYLD_FALLBACK_LIBRARY_PATH,这个方法有效。 - Marcellinov

    1
    以下方法对我有效。
    brew install zlib
    brew install bzip2
    brew install openssl
    export LDFLAGS="-L/usr/local/opt/zlib/lib -L/usr/local/opt/bzip2/lib -L/usr/local/opt/openssl@3/lib"
    export CPPFLAGS="-I/usr/local/opt/zlib/include -I/usr/local/opt/bzip2/include -I/usr/local/opt/openssl@3/include"
    

    1
    如果您正在使用PostgresApp,请相应地设置DYLD_LIBRARY_PATH环境变量,例如:
    DYLD_LIBRARY_PATH=/Applications/Postgres.app/Contents/MacOS/lib/ ../venv/bin/python manage.py syncdb
    

    1
    在 ~/.bash_profile 文件中添加以下行:
    export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/
    

    那么

    source ~/.bash_profile
    

    0

    0
    经过几个小时的故障排除,我在我的.zshrc文件中添加了以下行,这帮助了我。
    export DYLD_LIBRARY_PATH=/Library/PostgreSQL/11/lib
    

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