我尝试使用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的编译日志,请告诉我,我没有把它粘贴在这里,因为它太长了。
答案 0 :(得分:90)
错误是否说libssl.dylib
版本太旧了?
在我的Mac上,错误是libssl.dylib
和libcrypto.dylib
太旧而无法使用pyscopg。 mac使用的openssl
包为0.98,而pyscopg需要1.0.0或更高版本。
我的解决方案是:
从brew
安装openssl$ brew install openssl
将libssl.1.0.0.dylib
和libcrypto.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/
/usr/lib
目录中,制作一个软链接libssl.dylib
和libcrypto.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/565525)sudo 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