测试正在安装的Python模块依赖项

时间:2009-04-20 14:27:41

标签: python reflection import module python-module

考虑到模块的名称,如何测试是否安装了一组模块。 E.g。

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 个答案:

答案 0 :(得分:8)

您可以使用__import__()函数,例如::

for module in modules:
    try:
        __import__(module)
    except ImportError:
        do_something()

您还可以使用imp.find_module来确定是否可以找到模块,而不导入它::

import imp
for module in modules:
    try:
        imp.find_module(module)
    except ImportError:
        do_something()

哦,你不能使用eval()的原因是因为import是一个陈述,而不是一个表达。如果确实想要,你可以使用exec,但我不推荐它::

for module in modules:
    try:
        exec 'import ' + module
    except ImportError:
        do_something()

答案 1 :(得分:6)

这有什么问题?

modules = set(["sys", "os", "jinja"])
for m in modules:
    try:
        __import__(m)
    except ImportError:
        # do something

以上使用__import__功能。此外,它正在严格测试它是否存在 - 它实际上并没有在任何地方保存导入,但你可以很容易地修改它来做到这一点。

答案 2 :(得分:5)

值得理解find_module方法和__import__方法之间的权衡:

    无论是否保存对导入模块的引用,
  • __import__('foo')都会触发加载模块的任何副作用。那可能没问题。
  • find_module('foo')不会触发任何副作用,因此它应该始终是安全的。
  • 如果找到模块但在加载时遇到其他问题(例如,SyntaxError,NameError,......),这两种方法都不能正常工作
  • 根据您处理失败的方式,只需将__import__('foo')包装在try / except中,如果找到foo但会导致错误的结果,但是找不到 的foo导入栏。
  • find_module()无法处理虚线名称,因此如果您需要检查是否可以导入'foo.bar.bat.baz',则必须根据{{使用多次调用find_module和load_module 3}}

答案 3 :(得分:2)

modules = set(["sys", "os", "jinja"])
try:
  for module in modules:
    __import__(module)
  doSomething()
except ImportError, e:
    print e