我遵循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/5a70862f27d2284e9541http://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文件要容易得多。

10-04 10:51