Обработка ошибок при импорте модулей - PullRequest
30 голосов
/ 28 июня 2010

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

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

Ответы [ 3 ]

43 голосов
/ 28 июня 2010

Я не думаю, что 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
5 голосов
/ 29 июня 2017

В соответствии с https://stackoverflow.com/a/20228312/1587329 [изменено, с правкой @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
4 голосов
/ 28 июня 2010

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

...