Här är vad som fungerade för mig. Mina Python- och Oracle-versioner skiljer sig något från din, men samma tillvägagångssätt bör gälla. Se bara till att cx_Oracles binära installationsversion matchar din Oracle-klient och Python-versioner.
Mina versioner:
- Python 2.7
- Oracle Instant Client 11G R2
- cx_Oracle 5.0.4 (Unicode, Python 2.7, Oracle 11G)
- Windows XP SP3
Steg:
- Ladda ned Oracle Instant Client-paketet. Jag använde instantclient-basic-win32-11.2.0.1.0.zip. Packa upp den till C:\din\sökväg\to\instantclient_11_2
- Ladda ner och kör det binära installationsprogrammet cx_Oracle. Jag använde cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi. Jag installerade den för alla användare och pekade på Python 2.7-platsen den hittade i registret.
- Ställ in miljövariablerna ORACLE_HOME och PATH via ett batchskript eller vilken mekanism som helst som är vettig i din appkontext, så att de pekar på Oracle Instant Client-katalogen. Se källan för oracle_python.bat nedan. Jag är säker på att det måste finnas en mer elegant lösning för detta, men jag ville begränsa mina systemomfattande ändringar så mycket som möjligt. Se till att du placerar den riktade Oracle Instant Client-katalogen i början av PATH (eller åtminstone före alla andra Oracle-klientkataloger). Just nu gör jag bara kommandoradssaker så jag kör bara oracle_python.bat i skalet innan jag kör några program som kräver cx_Oracle.
- Kör regedit och kontrollera om det finns en NLS_LANG-nyckel inställd på \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE. Om så är fallet, byt namn på nyckeln (jag ändrade den till NLS_LANG_OLD) eller avaktivera den. Den här nyckeln ska bara användas som standard NLS_LANG-värde för Oracle 7-klienten, så det är säkert att ta bort den om du inte råkar använda Oracle 7-klienten någon annanstans. Som alltid, se till att säkerhetskopiera ditt register innan du gör ändringar.
- Nu bör du kunna importera cx_Oracle i ditt Python-program. Se källan för oracle_test.py nedan. Observera att jag var tvungen att ställa in anslutningen och SQL-strängarna till Unicode för min version av cx_Oracle.
Källa:oracle_python.bat
@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%
Källa: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()
Möjliga problem:
- "ORA-12705:Kan inte komma åt NLS-datafiler eller ogiltig miljö specificerad" - Jag stötte på detta innan jag gjorde registerändringen NLS_LANG.
- "TypeError:argument 1 måste vara unicode, inte str" - om du behöver ställa in anslutningssträngen till Unicode.
- "TypeError:förväntar ingen eller en sträng" - om du behöver ställa in SQL-strängen till Unicode.
- "ImportError:DLL-laddning misslyckades:Den angivna proceduren kunde inte hittas." - kan indikera att cx_Oracle inte kan hitta rätt Oracle-klient-DLL.