Catch python 'ImportError', если импорт из исходного каталога - программирование
Подтвердить что ты не робот

Catch python 'ImportError', если импорт из исходного каталога

Когда вы пытаетесь импортировать модуль foo во время нахождения в исходном каталоге, появляется довольно запутанное сообщение ImportError: ImportError: No module named foo.

Как я могу легко поймать этот случай и вернуть более информативное сообщение, например. "Пожалуйста, не загружайте модуль foo из исходного каталога"?

Имея __init__.py, я бы начал с:

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

Поэтому я хотел бы различать разные причины для ImportError (например, потому что модуль с именем foo вообще не установлен) и определить случай, когда setup.py находится в текущем каталоге. Каким будет элегантный способ сделать это?

4b9b3361

Ответ 1

ImportError: No module named foo на самом деле означает, что модуль foo.py или пакет foo/__init__.py не может быть найден ни в одном из каталогов в пути поиска (sys.path list).

Так как sys.path обычно содержит . (текущий каталог), возможно, это то, что вы имели в виду, находясь в исходном каталоге. Вы находитесь в каталоге верхнего уровня пакета foo (где находится файл __init__.py), поэтому, очевидно, вы не можете найти foo/__init__.py.

Наконец, вы ответили на свой вопрос, более или менее:

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

В качестве альтернативы вы можете проверить содержимое sys.path, текущего каталога и, если известно, ожидаемого каталога пакетов и создать четкое и контекстно-зависимое сообщение.

Или добавьте .. в переменную среды PYTHONPATH (в Unix), чтобы вы могли запускаться из вашего исходного каталога. Может даже работать в Windows, но я не знаю.