2012-07-25 17 views
27

Sto provando a creare cx_Oracle per un'installazione di Python 2.7.2 e Oracle 11g ma il cx_Oracle.so non può trovare libclntsh.so.11.1 così da importare cx_Oracle in Python fallisce.Problema di creazione di cx_Oracle - libclntsh.so.11.1 => non trovato

/mypath/cx_Oracle-5.1.1/build/lib.linux-x86_64-2.7-11g]$ ldd cx_Oracle.so 
    libclntsh.so.11.1 => not found 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ae9be290000) 
    libc.so.6 => /lib64/libc.so.6 (0x00002ae9be4ab000) 
    /lib64/ld-linux-x86-64.so.2 (0x000000389b600000) 

devo libclntsh.so.11.1 nel mio Oracle directory di installazione del client:

/apps/oracle/client/11.2.0.1/home1/lib]$ ls -l libclntsh.so* 
libclntsh.so -> /apps/oracle/client/11.2.0.1/home1/lib/libclntsh.so.11.1 
libclntsh.so.11.1 

E il setup.py cx_Oracle è in ripresa questa dir lib up:

/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build 
/apps/oracle/client/11.2.0.1/home1/ 
running build 
running build_ext 
building 'cx_Oracle' extension 
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/apps/oracle/client/11.2.0.1/home1/rdbms/demo -I/apps/oracle/client/11.2.0.1/home1/rdbms/public -I/apps/bweb/python-2.7.2/include/python2.7 -c cx_Oracle.c -o build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -DBUILD_VERSION=5.1.1 
In file included from /apps/oracle/client/11.2.0.1/home1/rdbms/public/oci.h:3024, 
       from cx_Oracle.c:10: 
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10788: warning: function declaration isn't a prototype 
/apps/oracle/client/11.2.0.1/home1/rdbms/public/ociap.h:10794: warning: function declaration isn't a prototype 
gcc -pthread -shared build/temp.linux-x86_64-2.7-11g/cx_Oracle.o -L/apps/oracle/client/11.2.0.1/home1/lib -lclntsh -o build/lib.linux-x86_64-2.7-11g/cx_Oracle.so 

C'è qualcosa di chiaramente sbagliato in questa configurazione?

Grazie

UPDATE

mio LD_LIBRARY_PATH contiene la directory lib di cui sopra con libclntsh.so.11.1

$ echo $LD_LIBRARY_PATH 
/apps/oracle/client/11.2.0.1/lib 

Questo non sembra fare alcuna differenza. Ricostruisco il file cx_Oracle.so e viene ancora visualizzato libclntsh.so.11.1 => not found quando eseguo $ ldd cx_Oracle.so.

Python avendo caricare il modulo integrato:

Python 2.7.2 (default, Jan 19 2012, 14:38:32) 
[GCC 3.4.6 20060404 (Red Hat 3.4.6-11)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import cx_Oracle 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory 

RISOLTO

Il problema è stato correlato alla variabile ambiente LD_LIBRARY_PATH. A causa delle restrizioni sul setup con cui sto lavorando (corp env) ho dovuto creare cx_Oracle come un altro utente (account di sistema). cioè correvo questo:

$ sudo -u username python27 setup.py build 

Così, anche se LD_LIBRARY_PATH è stato impostato correttamente per me, la mia versione non è stato utilizzato quando il comando è stato eseguito come un altro utente. Sono stato in grado di creare con successo spostando il codice sorgente in una posizione in cui avevo le autorizzazioni e eseguendo la build come utente.

risposta

26

Aggiungi /apps/oracle/client/11.2.0.1/home1/lib/ al vostro LD_LIBRARY_PATH variabile di ambiente eseguire il seguente comando nel terminale prima di pitone in esecuzione o aggiungere nella tua .bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/apps/oracle/client/11.2.0.1/home1/lib/ 
+0

quale sistema operativo stai utilizzando? Alcune distribuzioni UNIX usano 'LD_LIB_PATH' piuttosto che' LD_LIBRARY_PATH'? Potresti anche voler controllare le autorizzazioni sul file e assicurarti che sia leggibile dal tuo script. – Meitham

+1

RHEL 6. Penso che LD_LIBRARY_PATH sia corretto, ma sembra che non venga preso in considerazione quando la build di cx_Oracle si verifica per qualche motivo. – Alex

+0

Grazie. Ho provato questo e non sembra risolvere. Ho impostato il LD_LIBRARY_PATH e ho creato nuovamente cx_Oracle.so. Mostra ancora libclntsh.so.11.1 => non trovato. Confermato è impostato nell'interprete Python e non è in grado di caricare cx_Oracle a causa del problema precedente. Il problema è al momento della costruzione di cx_Oracle, corretto? 'os.environ [ 'LD_LIBRARY_PATH']' ' '/ apps/Oracle/client/11.2.0.1/lib' ' >>> import cx_Oracle Traceback (chiamata più recente scorso): File "", la linea 1 , in ' ' ImportError: libclntsh.so.11.1: impossibile aprire il file oggetto condiviso: Nessun file o directory ' – Alex

1

Sì. Hai dimenticato di dire al tuo strumento di cache del caricatore che deve cercare in quella directory per le librerie. Aggiungi tale directory a /etc/ld.so.conf o un file simile ed esegui ldconfig.

+0

Grazie. Ho già impostato ** LD_LIBRARY_PATH ** per includere questa directory lib: otterrebbe la stessa cosa? Non riesco a modificare /etc/ld.so.conf o simili in quanto non dispongono di privilegi. – Alex

+0

Per ora, ma * davvero * dovresti parlare con il sysadmin. –

+1

Su Fedora 20, LD_LIBRARY_PATH non lo ha tagliato per me, ma /etc/ld.so.conf.d/ ha funzionato: echo /usr/lib/oracle/12.1/client64/lib> /etc/ld.so.conf .d/oracle.conf; ldconfig –

0

Molti prodotti Oracle installare oraenv. Imposterà, tra le altre variabili di ambiente, LD_LIBRARY_PATH, quindi considera di eseguire . oraenv invece di impostare manualmente l'ambiente.

0

Impostare il LD_RUN_PATH.(LD_RUN_PATH viene utilizzato dal linker per specificare dove cercare le librerie solo in fase di esecuzione.)

Ora creare cx_Oracle.

/mypath/cx_Oracle-5.1.1]$ export LD_RUN_PATH="/apps/oracle/client/11.2.0.1/home1/lib" 
/mypath/cx_Oracle-5.1.1]$ python2.7 setup.py build 

Questo non richiederà l'impostazione di LD_LIBRARY_PATH durante l'importazione di cx_Oracle.

Problemi correlati