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

测试正在安装的Python模块依赖项,python,reflection,import,module,python-module,Python,Reflection,Import,Module,Python Module,给定模块的名称,如何测试是否安装了一组模块。例如 modules = set(["sys", "os", "jinja"]) for module in modules: # if test(module exists): # do something 虽然可以将测试写成: try: import sys except ImportError: print "No sys!" 这对我正在做的事情来说有点麻烦。有没有一种动态的方法可以做到这一点 我尝试过eval(“导入%

给定模块的名称,如何测试是否安装了一组模块。例如

modules = set(["sys", "os", "jinja"])

for module in modules:
  # if test(module exists):
  #   do something
虽然可以将测试写成:

try:
  import sys
except ImportError:
  print "No sys!"
这对我正在做的事情来说有点麻烦。有没有一种动态的方法可以做到这一点

我尝试过eval(“导入%s”%module),但它抱怨编译错误


我很感谢你的想法和建议。谢谢。

这个怎么了

modules = set(["sys", "os", "jinja"])
for m in modules:
    try:
        __import__(m)
    except ImportError:
        # do something
上面使用的是函数。此外,它正在严格测试它是否存在-它实际上并没有将导入保存到任何地方,但您可以轻松地修改它来实现这一点。

您可以使用如下函数:

for module in modules:
    try:
        __import__(module)
    except ImportError:
        do_something()
您还可以使用确定是否可以在不导入模块的情况下找到模块:

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()

有必要了解find_模块方法和
导入方法之间的权衡:

  • \uuuuu import\uuuu('foo')
    将触发加载模块的任何副作用,无论您是否保存对导入模块的引用。这可能是好的,也可能不是
  • find_模块('foo')
    不会引发任何副作用,因此它应该总是安全的
  • 如果找到了模块,但在加载时存在其他问题(例如SyntaxError、NameError等),则这两种方法都不能很好地工作
  • 根据您处理失败的方式,如果在try/except中简单地包装
    \uuuuuu import\uuuu('foo')
    ,如果找到了foo,但foo导入了未找到的条,则会产生误导性的结果
  • find_module()
    无法处理虚线名称,因此如果需要检查是否可以导入'foo.bar.bat.baz',则必须使用多个调用来查找_模块并按照
modules = set(["sys", "os", "jinja"])
try:
  for module in modules:
    __import__(module)
  doSomething()
except ImportError, e:
    print e