Oracle
 sql >> Database >  >> RDS >> Oracle

cx Oracle ImportError

Ciò è correlato alle modifiche della protezione dell'integrità del sistema (SIP) in El Capitan, che tra le altre cose impedisce che DYLD_LIBRARY_PATH venga ereditato dai processi generati.

Puoi modificare cx_Oracle.so libreria per utilizzare il percorso effettivo della libreria client Oracle invece del percorso cercato che non funziona più; assicurati di avere ORACLE_HOME ancora impostato per puntare alla posizione effettiva del tuo client istantaneo e tieni anche presente che il percorso esatto riportato da ImportError dovrebbe essere utilizzato - il 3071542110 il valore può variare a seconda della versione/build di Instant Client che hai installato:

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

... ma poi quella libreria non riesce a trovarne un'altra 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

Quindi dovresti cambiare anche quella libreria, con la quale potresti essere meno a tuo agio:

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

A seconda dell'esatta versione/build del client, potresti dover rendere il file scrivibile prima di eseguire quel comando, con:

chmod 755 $ORACLE_HOME/libclntsh.dylib.11.1

Con queste modifiche posso eseguire cx_Oracle prove su El Capitan.

Maggiori informazioni su install_name_change qui.

Sembra che il client istantaneo 12c sia stato creato in modo da evitare questo problema, quindi l'aggiornamento a quello sarà più semplice che hackerare i file 11g.