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

Posted

技术标签:

【中文标题】测试正在安装的 Python 模块依赖项【英文标题】:Test for Python module dependencies being installed 【发布时间】: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) 但抱怨编译错误。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于测试正在安装的 Python 模块依赖项的主要内容,如果未能解决你的问题,请参考以下文章

分型安装模块依赖项

Yarn 2 工作区未安装依赖项

如何在 RequireJS 中模拟单元测试的依赖项?

多模块项目中的 Maven 测试依赖项

在我的测试模块中提供 HiltTestApplication 作为依赖项失败

用于仅测试依赖项的 Gradle 变体感知依赖项管理