2013-02-07 12 views
16

Quando si tenta di importare un modulo foo mentre si è nella directory di origine, si ottiene un messaggio ImportError piuttosto ingannevole: ImportError: No module named foo.Catch python 'ImportError' se importato dalla directory di origine

Come posso catturare facilmente questo caso e restituire un messaggio più informativo, ad es. 'Per favore non caricare il modulo pippo dalla directory dei sorgenti'?

Avere la __init__.py, vorrei iniziare con:

try: 
    from _foo import * 
except ImportError: 
    ## check whether in the source directory... 

Quindi vorrei distinguere le diverse cause di un ImportError (ad esempio perché un modulo denominato foo non è installato affatto), e rilevare il caso in cui lo setup.py si trova nella directory corrente. Quale sarebbe un modo elegante per farlo?

risposta

22

ImportError: No module named foo in realtà significa che la (sys.path lista) Modulo foo.py o il pacchetto foo/__init__.py non è stato trovato in una delle directory nel percorso di ricerca.

Dal sys.path di solito contiene . (la directory corrente), che è probabilmente quello che si intende per essere nella directory di origine. Si trova nella directory di livello superiore del pacchetto foo (dove è il file __init__.py), quindi ovviamente non è possibile trovare foo/__init__.py.

Infine, hai risposto alla tua domanda, più o meno:

try: 
    from _foo import * 
except ImportError: 
    raise ImportError('<any message you want here>') 

alternativa, è possibile controllare il contenuto del sys.path, la directory corrente e, se noto, la directory del pacchetto previsto e produrre un anche un messaggio dettagliato e sensibile al contesto.

Oppure aggiungere .. alla variabile di ambiente PYTHONPATH (su Unix) per consentire l'esecuzione dalla directory di origine. Potrebbe perfino funzionare su Windows, ma non lo saprei.

+0

Grazie per la risposta rapida. Sono piuttosto alla ricerca di un modo per verificare se "ImportError" viene sollevato da "setup.py" che si trova nella directory corrente e lo distingue da altri casi. – Julian

+0

Quindi usa la seconda opzione che ho menzionato. Sapete quale pacchetto si sta tentando di importare (come ultima risorsa, estrarlo dal messaggio "ImportError') e si può ottenere il nome della directory corrente. La condizione che stai cercando corrisponde al pacchetto e il nome della directory sono gli stessi, no? – isedev

Problemi correlati