关于macos:cx oracle ImportError

cx oracle ImportError

我遵循了本教程,在Mac上安装cx_oracle。经过一些调整后,它成功了。我之前使用过Mavericks。然后我得到了El Capitan的升级。那就是灾难的来临。

它停止工作了。我之前在目录中找不到相关文件。由于系统完整性保护,我再次完成了整个过程,并将其安装在usr/local/lib/share/oracle/installclient_11_2

但是现在当我运行程序时。它将引发此错误消息:

1
2
3
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-对于python-mac-os-x-10-89 /

对我仍然没有运气:(

欢迎提出任何建议。在此先感谢!

================================================ =========================

更新:

在网上找到了此帖子,在El Capitan上神奇地工作。删除旧的安装,按照此说明逐步进行全新操作。


这与El Capitan中的系统完整性保护(SIP)更改有关,这尤其防止了DYLD_LIBRARY_PATH被生成的进程继承。

您可以修改cx_Oracle.so库,以使用Oracle客户端库的实际路径,而不是不再有效的搜索路径;确保您仍将ORACLE_HOME设置为指向实际的即时客户端位置,并注意应使用ImportError报告的确切路径-3071542110值可能会因Instant Client的版本/内部版本而异您已安装:

1
2
3
4
5
6
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:

1
2
3
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

因此,您也需要更改该库,您可能对此不太满意:

1
2
3
4
install_name_tool -change \\
  /ade/b/3071542110/oracle/ldap/lib/libnnz11.dylib \\
  $ORACLE_HOME/libnnz11.dylib \\
  $ORACLE_HOME/libclntsh.dylib.11.1

根据确切的客户端版本/内部版本,在运行该命令之前,可能需要使用以下命令使文件可写:

1
chmod 755 $ORACLE_HOME/libclntsh.dylib.11.1

有了这些更改,我可以在El Capitan上运行cx_Oracle测试。

更多关于install_name_change的信息。

看起来12c Instant Client的构建方式可以避免此问题,因此升级到该版本要比黑客入侵11g文件更简单。


使用

修复的示例

1
ln -s /opt/oracle/product/12.1.0/instantclient_12_1/libclntsh.dylib.12.1 /usr/local/lib/libclntsh.dylib.12.1