2013-02-07 9 views
16

Gdy ktoś próbuje zaimportować moduł foo będąc w katalogu źródłowym, otrzymuje dość mylącą wiadomość: ImportError: ImportError: No module named foo.Złap pytona "ImportError", jeśli import z katalogu źródłowego

Jak mogę łatwo złapać tę sprawę i zwrócić bardziej interesującą wiadomość, np. "Proszę nie ładować modułu foo z katalogu źródłowego"?

Mając __init__.py, chciałbym zacząć:

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

Więc chciałbym wyróżnić różne przyczyny dla ImportError (np ponieważ moduł nazwany foo nie jest zainstalowany w ogóle), a wykrycie sprawy w którym setup.py znajduje się w bieżącym katalogu. Jaki byłby elegancki sposób robienia tego?

Odpowiedz

22

ImportError: No module named foo faktycznie oznacza (sys.path listę) moduł foo.py lub pakiet foo/__init__.py nie można znaleźć w żadnym z katalogów w ścieżce wyszukiwania.

Od sys.path zazwyczaj zawierają . (bieżący katalog), to chyba to, co masz na myśli przez będąc w katalogu źródłowym. Jesteś w katalogu najwyższego poziomu pakietu foo (gdzie plik __init__.py) jest tak oczywisty, że nie możesz znaleźć foo/__init__.py.

Wreszcie, już odpowiedział na swoje pytanie, bardziej lub mniej:

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

Alternatywnie, można sprawdzić zawartość sys.path, w bieżącym katalogu i, jeśli jest znana, oczekiwany katalog pakiet i wygeneruje nawet komunikat szczegółowy i świadomy kontekstu.

Lub dodaj .. do zmiennej środowiskowej PYTHONPATH (w systemie Unix), aby umożliwić uruchamianie z katalogu źródłowego. Może nawet pracować w systemie Windows, ale nie wiedziałbym.

+0

Dzięki za szybką odpowiedź. Raczej szukam sposobu sprawdzenia, czy 'ImportError' został podniesiony przez' setup.py' znajdujący się w bieżącym katalogu i odróżnić go od innych przypadków. – Julian

+0

Więc użyj drugiej opcji, o której wspomniałem. Wiesz, który pakiet chcesz zaimportować (w ostateczności wyodrębnić go z wiadomości 'ImportError') i możesz uzyskać nazwę bieżącego katalogu. Warunek, którego szukasz, odpowiada nazwie pakietu i katalogu, która jest taka sama, nie? – isedev