Ecco cosa ha funzionato per me. Le mie versioni di Python e Oracle sono leggermente diverse dalle tue, ma dovrebbe essere applicato lo stesso approccio. Assicurati solo che la versione del programma di installazione binario cx_Oracle corrisponda al tuo client Oracle e alle versioni Python.
Le mie versioni:
- Python 2.7
- Oracle Instant Client 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Passaggi:
- Scarica il pacchetto Oracle Instant Client. Ho usato instantclient-basic-win32-11.2.0.1.0.zip. Decomprimilo in C:\your\path\to\instantclient_11_2
- Scarica ed esegui il programma di installazione binario cx_Oracle. Ho usato cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. L'ho installato per tutti gli utenti e l'ho indirizzato alla posizione di Python 2.7 che ha trovato nel registro.
- Imposta le variabili di ambiente ORACLE_HOME e PATH tramite uno script batch o qualsiasi meccanismo abbia senso nel contesto dell'app, in modo che puntino alla directory Oracle Instant Client. Vedi la fonte di oracle_python.bat di seguito. Sono sicuro che ci deve essere una soluzione più elegante per questo, ma volevo limitare il più possibile le mie modifiche a livello di sistema. Assicurati di inserire la directory Oracle Instant Client di destinazione all'inizio del PERCORSO (o almeno prima di qualsiasi altra directory client Oracle). In questo momento, sto solo facendo cose da riga di comando, quindi eseguo semplicemente oracle_python.bat nella shell prima di eseguire qualsiasi programma che richieda cx_Oracle.
- Esegui regedit e verifica se è presente una chiave NLS_LANG impostata in \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. In tal caso, rinomina la chiave (l'ho modificata in NLS_LANG_OLD) o deselezionala. Questa chiave deve essere utilizzata solo come valore NLS_LANG predefinito per il client Oracle 7, quindi è sicuro rimuoverla a meno che tu non stia utilizzando il client Oracle 7 da qualche altra parte. Come sempre, assicurati di eseguire il backup del registro prima di apportare modifiche.
- Ora dovresti essere in grado di importare cx_Oracle nel tuo programma Python. Vedi la fonte oracle_test.py di seguito. Nota che ho dovuto impostare la connessione e le stringhe SQL su Unicode per la mia versione di cx_Oracle.
Fonte:oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Fonte:oracle_test.py
import cx_Oracle
conn_str = u'user/[email protected]:port/service'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select your_col_1, your_col_2 from your_table')
for row in c:
print row[0], "-", row[1]
conn.close()
Possibili problemi:
- "ORA-12705:Impossibile accedere ai file di dati NLS o all'ambiente specificato non valido" - Mi sono imbattuto in questo prima di apportare la modifica del registro NLS_LANG.
- "TypeError:l'argomento 1 deve essere unicode, non str" - se è necessario impostare la stringa di connessione su Unicode.
- "TypeError:prevedendo Nessuno o una stringa" - se è necessario impostare la stringa SQL su Unicode.
- "ImportError:caricamento DLL non riuscito:impossibile trovare la procedura specificata." - potrebbe indicare che cx_Oracle non riesce a trovare la DLL del client Oracle appropriata.