测试Python模块依赖项是否已安装

7

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

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个回答

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

6
这有什么问题?
modules = set(["sys", "os", "jinja"])
for m in modules:
    try:
        __import__(m)
    except ImportError:
        # do something

上面的代码使用了__import__函数。同时,它严格测试该函数是否存在 - 它实际上并没有将导入保存在任何地方,但是您可以轻松修改它以执行此操作。

5

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

  • __import__('foo')将触发加载模块的任何副作用,无论您是否保存对导入模块的引用。这可能是可以接受的,也可能不是。
  • find_module('foo')不会触发任何副作用,因此它应始终是安全的。
  • 如果找到模块但在加载时有其他问题(例如SyntaxError、NameError等),则两种方法都不起作用。
  • 根据您如何处理故障,仅将__import__('foo')包装在try/except中将为您提供误导性的结果,如果找到foo但foo导入未找到的bar。
  • find_module()无法处理点名称,因此如果您需要检查是否可以导入'foo.bar.bat.baz',则必须根据docs.使用多个调用来find_module和load_module。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接