Более дружественные сообщения об ошибках на импорте для недостающих модулей

Вы не можете сделать этого, когда Ваш проект работает. Это?

5
задан pafcu 24 October 2009 в 18:57
поделиться

4 ответа

Я бы добавил в пакет дополнительные модули, которые при импорте распечатывают более полезное сообщение, а затем вызывают обычную ошибку ImportError. Когда истинный модуль установлен, ваши модули будут затенены (убедитесь, что вы добавили каталог, в котором они находятся, на конце sys.path).

2
ответ дан 13 December 2019 в 05:37
поделиться

Вам не нужно ловить ImportError для каждый импорт. Вы можете использовать глобальный блок try..except в точке входа вашего скрипта.

Вы можете получить имя отсутствующего модуля из экземпляра ImportError, используя свойство message.

Например, , если точка входа вашего скрипта - main.py:

if __name__ == '__main__':
    try:
        import module1
        import module2

        module1.main()
     except ImportError as error:
        print "You don't have module {0} installed".format(error.message[16:])

Не импортируйте ничего за пределами блока try..except . Это будет охватывать module1 и module2, а также все импортированные ими модули и т. Д.

Как вы сказали, вы можете определить свою собственную функцию import_safe :

def import_safe(module):
    try:
        return __import__(module)
    except ImportError as error:
        print "You don't have module {0} installed".format(error.message[16:])

Затем вы можете использовать функцию:

sys = import_safe('sys')
gtk = import_safe('gkt')

На мой взгляд, кулачная стратегия лучше. Второй сделает ваш код трудным для чтения. И изменим существенную часть языка.

Второй сделает ваш код трудным для чтения. И изменим существенную часть языка.

Второй сделает ваш код трудным для чтения. И изменим существенную часть языка.

3
ответ дан 13 December 2019 в 05:37
поделиться

Вы можете указать место, где он всегда будет выполняться (например, в site.py или sitecustomize.py):

import __builtin__

realimport = __builtin__.__import__

def myimport(modname, *a):
  try:
    return realimport(modname, *a)
  except ImportError, e:
    print "Oops, couldn't import %s (%s)" % (modname, e)
    print "Here: add nice directions and whatever else"
    raise

__builtin__.__import__ = myimport

См. __ import __ docs здесь .

6
ответ дан 13 December 2019 в 05:37
поделиться

Заменить sys.excepthook :

orig_excepthook = sys.excepthook

def my_excepthook(type, value, tb):
    orig_excepthook(type, value, tb)
    if issubclass(type, ImportError):
        # print some friendly message

sys.excepthook = my_excepthook
1
ответ дан 13 December 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: