Вы не можете сделать этого, когда Ваш проект работает. Это?
Я бы добавил в пакет дополнительные модули, которые при импорте распечатывают более полезное сообщение, а затем вызывают обычную ошибку ImportError. Когда истинный модуль установлен, ваши модули будут затенены (убедитесь, что вы добавили каталог, в котором они находятся, на конце sys.path).
Вам не нужно ловить 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')
На мой взгляд, кулачная стратегия лучше. Второй сделает ваш код трудным для чтения. И изменим существенную часть языка.
Второй сделает ваш код трудным для чтения. И изменим существенную часть языка. Второй сделает ваш код трудным для чтения. И изменим существенную часть языка.Вы можете указать место, где он всегда будет выполняться (например, в 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 здесь .
Заменить 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