Подтвердить что ты не робот

Обработка ошибок при импорте модулей

У этого, вероятно, есть очевидный ответ, но я новичок. У меня есть "модуль" (на самом деле это просто файл с множеством функций, которые я часто использую), в начале которого я импортирую ряд других модулей. Однако, поскольку я работаю на многих системах, не все модули могут загружаться на какой-либо конкретной машине. Чтобы сделать вещи немного сложнее, я также изменяю имена пакетов при импорте их - например, matplotlib получает сокращение от mp.

То, что я хотел бы сделать, это загрузить только те модули, которые существуют в системе, которую я использую в настоящее время, и выполнять обработку ошибок на тех, которые этого не делают. Единственный способ, которым я могу это сделать, заключается в том, чтобы включить каждый оператор импорта в свой собственный блок try, который кажется довольно не-пифоническим. Если я вложу их все в один блок try, в зависимости от того, какой модуль выдает ошибку, это предотвратит загрузку последующих модулей. Любые идеи, которые могут заставить вещи выглядеть красивее? Было бы так легко, если бы я не хотел менять их имена...

4b9b3361

Ответ 1

Я не думаю, что блок try except непифонический; вместо этого это обычный способ обработки импорта на Python.

Цитата Погружение в Python:

Существует много других применений для исключения, кроме обработки фактических условия ошибки. Общее использование в стандартная библиотека Python - попытаться импортировать модуль, а затем проверить работал ли он. Импорт модуля который не существует, Исключение ImportError. Вы можете использовать это определение нескольких уровней функциональность, основанная на том, какие модули доступны во время выполнения или для поддержка нескольких платформ (где код, специфичный для платформы, разделен в разные модули).

Следующий пример демонстрирует, как использовать исключение для поддержки функциональность платформы.

try:
    import termios, TERMIOS                     
except ImportError:
    try:
        import msvcrt                           
    except ImportError:
        try:
            from EasyDialogs import AskPassword 
        except ImportError:
            getpass = default_getpass           
        else:                                   
            getpass = AskPassword
    else:
        getpass = win_getpass
else:
    getpass = unix_getpass

Ответ 2

Самый простой способ - обеспечить загрузку всех модулей во все системы. Если это не сработает, включение каждого оператора import в блок try является следующим лучшим решением, а не непитоновым вообще.

Ответ 3

По мнению fooobar.com/info/243259/... [изменено, с правкой @Ian]

from importlib import import_module

named_libs = [('numpy', 'np'), ('matplotlib', 'mp')] # (library_name, shorthand)
for (name, short) in named_libs:
    try:
        lib = import_module(name)
    except:
        print sys.exc_info()
    else:
        globals()[short] = lib

импортирует все библиотеки в named_libs. Первая строка - это имя библиотеки, вторая - сокращение. Для безымянных библиотек вы можете использовать оригинал:

from importlib import import_module     

libnames = ['numpy', 'scipy', 'operator']
for libname in libnames:
    try:
        lib = import_module(libname)
    except:
        print sys.exc_info()
    else:
        globals()[libname] = lib