我遵循this tutorial在Mac上安装cx_oracle。经过一些调整后,它成功了。我之前使用过Mavericks。然后,我获得了升级到El Capitan 的功能。那就是灾难发生的地方。
它停止工作了。我之前在目录中找不到相关文件。由于System Integrity Protection的缘故,我再次经历了整个过程,并将其安装在usr/local/lib/share/oracle/installclient_11_2
上。
但是现在当我运行程序时。它引发以下错误消息:
ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Library not loaded: /ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1
Referenced from: /Library/Python/2.7/site-packages/cx_Oracle.so
Reason: image not found
我在网上尝试了很多解决方案,例如https://gist.github.com/rmoff/5a70862f27d2284e9541,http://kevindalias.com/2014/03/26/how-to-set-up-cx_oracle-for-python-on-mac-os-x-10-89/
依旧没有运气:(
欢迎任何建议。提前致谢!
================================================== ========================
更新:
在网上找到this post,可以在 El Capitan 上神奇地工作。删除旧的安装,按照此说明逐步操作,重新开始安装。
最佳答案
这与system integrity protection (SIP) changes in El Capitan有关,除其他事项外,它阻止DYLD_LIBRARY_PATH由spawned processes继承。
您可以修改cx_Oracle.so
库以使用Oracle客户端库的实际路径,而不是不再使用的搜索路径。确保您的ORACLE_HOME
仍设置为指向实际的即时客户端位置,并请注意应使用ImportError
报告的确切路径-3071542110
值可能会因所安装的Instant Client的版本/内部版本而异:
export ORACLE_HOME=/usr/local/lib/share/oracle/installclient_11_2
install_name_tool -change \
/ade/b/3071542110/oracle/rdbms/lib/libclntsh.dylib.11.1 \
$ORACLE_HOME/libclntsh.dylib.11.1 \
/Library/Python/2.7/site-packages/cx_Oracle.so
...但是那个库找不到另一个Oracle:
ImportError: dlopen(/Library/Python/2.7/site-packages/cx_Oracle.so, 2): Library not loaded: /ade/b/3071542110/oracle/ldap/lib/libnnz11.dylib
Referenced from: /usr/local/lib/share/oracle/installclient_11_2/libclntsh.dylib.11.1
Reason: image not found
因此,您也需要更改该库,您可能对此不太满意:
install_name_tool -change \
/ade/b/3071542110/oracle/ldap/lib/libnnz11.dylib \
$ORACLE_HOME/libnnz11.dylib \
$ORACLE_HOME/libclntsh.dylib.11.1
根据确切的客户端版本/内部版本,您可能需要在运行该命令之前使文件可写,方法是:
chmod 755 $ORACLE_HOME/libclntsh.dylib.11.1
通过这些更改,我可以在El Capitan上运行
cx_Oracle
测试。更多关于
install_name_change
here。看起来12c即时客户端的构建可以避免此问题,因此升级到该客户端比黑客入侵11g文件要容易得多。