Oracle
 sql >> Datenbank >  >> RDS >> Oracle

cx oracle Importfehler

Dies hängt mit den Änderungen des Systemintegritätsschutzes (SIP) in El Capitan zusammen, die unter anderem verhindern, dass DYLD_LIBRARY_PATH von erzeugten Prozessen geerbt wird.

Sie können cx_Oracle.so ändern Bibliothek, um den tatsächlichen Pfad zur Oracle-Clientbibliothek anstelle des gesuchten Pfads zu verwenden, der nicht mehr funktioniert; Stellen Sie sicher, dass Sie ORACLE_HOME haben immer noch so eingestellt ist, dass sie auf Ihren tatsächlichen Instant-Client-Speicherort verweist, und beachten Sie auch, dass der genaue Pfad von ImportError gemeldet wird verwendet werden sollte - der 3071542110 Der Wert kann je nach Version/Build von Instant Client, den Sie installiert haben, variieren:

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

... aber dann kann diese Bibliothek keine andere Oracle-Bibliothek finden:

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

Sie müssten also auch diese Bibliothek ändern, womit Sie möglicherweise weniger zufrieden sind:

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

Abhängig von der genauen Client-Version/Build müssen Sie die Datei möglicherweise beschreibbar machen, bevor Sie diesen Befehl ausführen, mit:

chmod 755 $ORACLE_HOME/libclntsh.dylib.11.1

Mit diesen Änderungen kann ich cx_Oracle ausführen Tests auf El Capitan.

Mehr zu install_name_change hier.

Es sieht so aus, als ob der 12c-Instant-Client so gebaut wurde, dass dieses Problem vermieden wird. Ein Upgrade darauf ist also einfacher als das Herumhacken in den 11g-Dateien.