【问题标题】:Test for Python module dependencies being installed测试正在安装的 Python 模块依赖项
【发布时间】:2010-10-20 14:09:38
【问题描述】:

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

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) 但抱怨编译错误。

感谢您的想法和建议。谢谢。

【问题讨论】:

    标签: python reflection import module python-module


    【解决方案1】:

    这是怎么回事?

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

    以上使用__import__函数。此外,它正在严格测试它是否存在 - 它实际上并没有将导入保存在任何地方,但您可以轻松修改它来做到这一点。

    【讨论】:

      【解决方案2】:

      你可以像这样使用__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()
      

      【讨论】:

        【解决方案3】:
        modules = set(["sys", "os", "jinja"])
        try:
          for module in modules:
            __import__(module)
          doSomething()
        except ImportError, e:
            print e
        

        【讨论】:

          【解决方案4】:

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

          • __import__('foo') 将触发加载模块的任何副作用,无论您是否保存对导入模块的引用。这可能没问题,也可能不行。
          • find_module('foo') 不会触发任何副作用,因此它应该始终是安全的。
          • 如果模块被找到但在加载时有其他问题(例如,SyntaxError、NameError、...),这两种方法都不能正常工作
          • 根据您处理失败的方式,如果找到了 foo 但 foo 导入了 找到的 bar,则简单地将 __import__('foo') 包装在 try/except 中会给您带来误导性结果。
          • find_module() 无法处理带点的名称,因此如果您需要检查 'foo.bar.bat.baz' 是否可以导入,您必须按照docs. 多次调用 find_module 和 load_module

          【讨论】:

            猜你喜欢
            • 2016-09-16
            • 2013-08-26
            • 1970-01-01
            • 2014-11-22
            • 2014-02-17
            • 1970-01-01
            • 1970-01-01
            • 2011-09-07
            • 1970-01-01
            相关资源
            最近更新 更多