Тест для устанавливаемых зависимостей модулей Python
Как можно проверить, установлен ли набор модулей, учитывая имена модулей. Е. Г.
modules = set(["sys", "os", "jinja"])
for module in modules:
# if test(module exists):
# do something
пока можно записать тесты как:
try:
import sys
except ImportError:
print "No sys!"
Это немного громоздко для того, что я делаю. Есть ли динамичный способ сделать это?
Я пробовал eval ("import %s" %module), но это вызвало ошибку компиляции.
Я благодарен за ваши мысли и предложения. Спасибо.
4 ответов
что в этом плохого?
modules = set(["sys", "os", "jinja"])
for m in modules:
try:
__import__(m)
except ImportError:
# do something
выше используется __import__
стоит понять компромиссы между подходом find_module и __import__
подход:
-
__import__('foo')
вызовет любые побочные эффекты загрузки модуля, независимо от того, сохраняете ли вы ссылку на импортированный модуль. Это может быть нормально или нет. -
find_module('foo')
не вызывает никаких побочных эффектов, поэтому он всегда должен быть безопасным. - ни один из подходов не работает хорошо, если модуль найден, но имеет другие проблемы во время загрузки (например. Синтаксис ошибка, NameError, ...)
- в зависимости от того, как вы обрабатываете сбои, просто обертывание
__import__('foo')
в try / except даст вам вводящие в заблуждение результаты, если foo найден, но Foo импортирует бар, который не нашли. -
find_module()
не может обрабатывать пунктирные имена, поэтому, если вам нужно проверить, есть ли ' foo.бар.летучая мышь.baz ' можно импортировать, вы должны использовать несколько вызовов find_module и load_module в соответствии с документы.
modules = set(["sys", "os", "jinja"])
try:
for module in modules:
__import__(module)
doSomething()
except ImportError, e:
print e