Installare cx_Oracle (per Python) su Windows

Premetto subito che questo articolo è ad alto contenuto informatico e di utilità pressoché personale (e forse di uno sparuto gruppo di smanettoni) perché raccoglie alcuni appunti che mi potrebbero servire in futuro e quindi per non andarli a cercare nei meandri della rete me li appunto qui per averli sempre a portata di mano. Non credo ci sia altro da aggiungere su quello di cui parlerò ma casomai non si fosse ancora capito il problema in questione è l’installazione di cx_Oracle su Windows che per i non addetti al settore è il driver ufficiale per connettersi a database Oracle dal linguaggio di programmazione Python.

dcn_screen2

Se siete ligi al dovere, conoscete il mondo Oracle e siete abituati ad ammazzare le mosche con i carri armati, con ogni probabilità avrete almeno già Oracle XE installato sulla vostra macchina e quindi per poter interrogare il database da Python vi basterà scaricare cx_Oracle, installarlo eseguendo la rapidissima e velocissima procedura guidata e subito dopo sarete operativi pronti a reperire, manipolare e archiviare i dati come desiderato.

Se invece siete dei minimalisti che centellinate le risorse vivendo perennemente in stato di spending review, molto probabilmente non avete Oracle XE installato (non faccio proprio riferimento alla versione completa perché quella è un privilegio di pochi server) e quindi dopo aver scaricato ed avviato l’installazione di cx_Oracle (che avverrà senza batter ciglio né segnalazione di errori), vi stupirete del fatto che quando tenterete di accedere ad Oracle dal vostro codice Python, riceverete l’errore:

>>> import cx_Oracle
Traceback (most recent call last):
File "", line 1, in
ImportError: DLL load failed: The specified module could not be found.

Questo dipende dal fatto che non avendo Oracle installato sulla macchina in questione (né la versione completa, né la express edition – XE – né l’instant client) vi manca una DLL (il messaggio DLL load failed è lapidario), una variabile d’ambiente e qualche chiave nel registro di Windows, il tutto perché con ogni probabilità non avete letto il file README del software che avete appena installato o lo avete fatto in maniera estremamente distratta.

Ora che sapete quello che c’è da fare, tralascio le prime 2 opzioni per venire a capo della situazione, ovvero l’installazione di Oracle in versione completa e della versione XE, e vi elenco brevemente il da farsi se da buoni minimalisti volete usare l’Oracle Instant Client. Le operazioni da eseguire saranno:

  1. scaricare e scompattare l’Oracle Instant Client dal sito ufficiale in una cartella a piacimento (es. C:\Oracle\instantclient\)
  2. creare una variabile d’ambiente di Windows ORACLE_HOME che faccia riferimento alla cartella dove al punto precedente avete salvato il client
  3. aggiungete la variabile ORACLE_HOME al PATH
  4. eseguite le 3 applicazioni presenti nel client (uidrvci.exe, genezi.exe, adrci.exe) per creare le opportune chiavi nel registro di sistema che dovrebbero essere
    • HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
    • HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID
    • HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ALL_HOMES
    • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

    e contenere la ORACLE_HOME

A questo punto dalla console di Python oppure andando ad eseguire direttamente del vostro codice il problema DLL load failed dovrebbe essere scomparso interagire con Oracle da Python non dovrebbe più essere un problema per voi.

Metto le mani avanti e preciso che pur essendo un minimalista della prima ora, quando so di dover lavorare con Oracle come DBMS non ho nessuna remora ad installarmi Oracle XE che può sempre tornare utile in fase di unit test. Mi è capitato però di dover correre in soccorso di una collega che più minimalista di me ha preferito non installare nulla che non fosse strettamente indispensabile e forse anche qualcosa di meno. Se anche voi siete della scuola “Tutto quello che non è assolutamente indispensabile non si installa”, forse un giorno quanto scritto vi potrebbe risultare utile.

Altrimenti io vi avevo avvisato…

Rispondi