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

时间:2012-07-06 15:52:44

标签: python virtualenv psycopg2

我尝试使用psycopg2在virtualenv中安装pip,编译看起来没问题,它说“成功安装了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期间,我看到了shortens from 64-bit to 32-bit之类的警告。我的编译器是i686-apple-darwin11-llvm-gcc-4.2,默认情况下是mac os x lion。

我看到几个与psycopg2安装相关的帖子,但大多数都是通过在虚拟环境中安装来解决的。那么......有人能给我一个建议吗?谢谢!真的很感激。

P.S。如果你需要安装psycopg2的编译日志,请告诉我,我没有把它粘贴在这里,因为它太长了。

9 个答案:

答案 0 :(得分:90)

错误是否说libssl.dylib版本太旧了?

在我的Mac上,错误是libssl.dyliblibcrypto.dylib太旧而无法使用pyscopg。 mac使用的openssl包为0.98,而pyscopg需要1.0.0或更高版本。

我的解决方案是:

  1. 从brew

    安装openssl
    $ brew install openssl
    
  2. libssl.1.0.0.dyliblibcrypto.1.0.0.dylib/usr/local/Cellar/openssl/1.0.1c复制到/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/
    
  3. /usr/lib目录中
  4. ,制作一个软链接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
    

答案 1 :(得分:20)

在OSX 10.11+(El Capitan或更高版本)解决方案中更换符号链接(参见上文 - https://stackoverflow.com/a/11911870/565525sudo rm libssl.dylib libcrypto.dylib报告Operation not permitted。对我有用的解决方案是:

brew install openssl

找到openssl brew lib所在的位置,从目录/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')"

答案 2 :(得分:20)

我有类似的问题。我曾使用Anaconda安装python和一些软件包,然后使用pip来安装psycopg2。我能够通过卸载psycopg2并使用conda包管理器而不是pip重新安装它来修复错误。

pip uninstall psycopg2
conda install psycopg2

答案 3 :(得分:16)

我认为在Mac中我们需要:

qry1 = """UPDATE mydb.table1"""
qry2 = """INNER JOIN mydb.table2 ON mydb.table1.item1 = mydb.table2.item1"""
qry3 = """SET mydb.table1.item1 = If(mydb.table2.item1 > 0, mydb.table2.item1, mydb.table1.item1)"""

cursor.execute(qry1)
cursor.execute(qry2)
cursor.execute(qry3)

conn.commit()
conn.close()

答案 4 :(得分:11)

谢谢@khrf的回答。

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

export DYLD_LIBRARY_PATH=/Library/PostgreSQL/9.3/lib

如果您想避免每次都输入,可以将其放在~/.bash_profile中。

答案 5 :(得分:1)

如果您使用的是PostgresApp,请相应地设置DYLD_LIBRARY_PATH环境变量,例如:

DYLD_LIBRARY_PATH=/Applications/Postgres.app/Contents/MacOS/lib/ ../venv/bin/python manage.py syncdb

答案 6 :(得分:0)

几个小时的故障排除后,添加到我的.zshrc文件中的以下行帮助了我

export DYLD_LIBRARY_PATH=/Library/PostgreSQL/11/lib

答案 7 :(得分:0)

找到libssl和libcrypto文件的位置,然后在zshrc文件中设置LIBRARY_PATH即可。

参考: Add library search path to clang https://mithun.co/hacks/library-not-loaded-libcrypto-1-0-0-dylib-issue-in-mac/

答案 8 :(得分:0)

在〜/ .bash_profile中添加以下行

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/

然后

source ~/.bash_profile