2013-02-07 7 views
16

Wenn man versucht, ein Modul foo im Quellverzeichnis zu importieren, bekommt man eine ziemlich verwirrende ImportError Nachricht: ImportError: No module named foo.Fangen python 'ImportError' wenn aus Quellverzeichnis importieren

Wie kann ich diesen Fall leicht abfangen und eine informativere Nachricht, z.B. 'Bitte Modul foo nicht aus dem Quellverzeichnis laden'?

die __init__.py Having, würde ich beginnen mit:

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

So würde Ich mag die verschiedenen Ursachen für eine ImportError unterscheiden (zB weil ein Modul foo benannt ist nicht installiert), und erfassen den Fall in dem sich die setup.py im aktuellen Verzeichnis befindet. Was wäre eine elegante Art, dies zu tun?

Antwort

22

ImportError: No module named foo bedeutet eigentlich das Modul foo.py oder Paket foo/__init__.py nicht in eines der Verzeichnisse im Suchpfad (sys.path Liste) gefunden werden kann.

Da sys.path in der Regel . (das aktuelle Verzeichnis) enthält, das ist wahrscheinlich das, was Sie gemeint von im Quellverzeichnis zu sein. Sie befinden sich in der obersten Ebene des Pakets foo (wo die __init__.py Datei ist) so offensichtlich können Sie foo/__init__.py nicht finden.

Schließlich haben Sie Ihre eigene Frage beantwortet, mehr oder weniger:

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

Alternativ können Sie den Inhalt des sys.path überprüfen, das aktuelle Verzeichnis und, falls bekannt, das erwartete Paket-Verzeichnis und erzeugen ein sogar detaillierte und kontextsensitive Nachricht.

Oder .. zur PYTHONPATH Umgebungsvariable (unter Unix) hinzufügen, damit Sie von Ihrem Quellverzeichnis ausführen können. Könnte sogar unter Windows funktionieren, aber ich würde es nicht wissen.

+0

Danke für die schnelle Antwort. Ich suche eher nach einer Möglichkeit, zu überprüfen, ob der 'ImportError' durch das' setup.py' ausgelöst wird, das sich im aktuellen Verzeichnis befindet und unterscheidet es von anderen Fällen. – Julian

+0

Verwenden Sie also die zweite Option, die ich erwähnt habe. Sie wissen, welches Paket Sie importieren möchten (als letztes Mittel, extrahieren Sie es aus der 'ImportError'-Nachricht), und Sie können den aktuellen Verzeichnisnamen abrufen. Die Bedingung, nach der Sie suchen, entspricht dem Paket- und Verzeichnisnamen, der gleich ist, nein? – isedev

Verwandte Themen