Поймайте питона ' ImportError' если импорт из исходного справочника

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

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

Наличие __ init __. py , я начал бы с:

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

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

18
nl ja de

1 ответы

ImportError: No module named foo actually means the module foo.py or package foo/__init__.py could not be found in any of the directories in the search path (sys.path list).

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

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

try:
    from _foo import *
except ImportError:
    raise ImportError('')

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

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

26
добавлено
Так используйте второй вариант, который я упомянул. Вы знаете, какой пакет вы пытаетесь импортировать (как последнее прибежище, извлеките его из ImportError сообщение), и можно получить имя текущего каталога. Условие, которое вы ищете, соответствует пакету и имени каталога, являющемуся тем же самым, нет?
добавлено автор isedev, источник
Спасибо за быстрый ответ. I' m довольно ищущий способ проверить, поднят ли ImportError setup.py располагаемый в текущем каталоге и отличает его от других случаев.
добавлено автор Julian, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community