2016-04-18 8 views
2

При работе над большими проектами я очень заинтересован в обнаружении и обработке ошибок. Я использую некоторые модули, которые пользователь может установить или не установить, поэтому мне нужно учитывать эту возможность.Динамическое обнаружение отсутствующих модулей (Python)

Я хотел бы знать, как определить, какие модули отсутствуют при попытке импортировать их. В настоящее время у меня есть набор try/except блоков, которые отслеживают ImportErrors и добавляют имена модулей, создающих ошибки, в список.

Текущий код:

errors = [] 
try: 
    import socket 
except ImportError: 
    errors.append('socket') 
    pass 
try: 
    import shutil 
except ImportError: 
    errors.append('shutil') 
try: 
    import urllib 
except ImportError: 
    errors.append('urllib') 
    pass 
if len(errors) > 0: 
    print colors.red + '[!] ' + colors.end + 'Error: The Following Module(s) Encountered Error(s): \n' 
    for i in range(len(errors)): 
     print '\t' + errors[i] 
    print colors.blue + '\n[*] ' + colors.end + 'Please Install/Reinstall the Listed Modules' 
    quit() 

Этот метод, кажется, работает нормально, но я хотел бы способ, который будет занимать меньше общую комнату. Основная причина использования этого метода multi-try/except block заключается в том, что мне нужно определить, какой модуль имел проблемы с импортом.

+0

Почему бы не использовать [надлежащую упаковку] (https://python-packaging-user-guide.readthedocs.org/en/latest/), так что 'pip' может позаботиться об установке зависимостей? Таким образом, вы переносите ответственность за управление зависимостями * вне * вашего кода и не должны беспокоиться о том, как обрабатывать ошибки. –

ответ

0
import importlib 

moduleNames = ['socket', 'shutil', 'urllib'] 

missingModuleNames = [] 

for moduleName in moduleNames: 
    try: 
     importlib.import_module (moduleName) 
    except: 
     missingModuleNames.append (moduleName) 

print (missingModuleNames)