Тест для устанавливаемых зависимостей модулей 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 ответов


можно использовать __import__()


что в этом плохого?

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