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

Bri*_*unt 7 python reflection import module python-module

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

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

for module in modules:
  # if test(module exists):
  #   do something
Run Code Online (Sandbox Code Playgroud)

虽然可以将测试写成:

try:
  import sys
except ImportError:
  print "No sys!"
Run Code Online (Sandbox Code Playgroud)

这对我正在做的事情来说有点麻烦.有没有动态的方法来做到这一点?

我已经尝试了eval("import%s"%module),但是抱怨编译错误.

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

Ric*_*and 8

你可以使用这样的__import__()函数::

for module in modules:
    try:
        __import__(module)
    except ImportError:
        do_something()
Run Code Online (Sandbox Code Playgroud)

您还可以使用它imp.find_module来确定是否可以在导入模块的情况下找到模块::

import imp
for module in modules:
    try:
        imp.find_module(module)
    except ImportError:
        do_something()
Run Code Online (Sandbox Code Playgroud)

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

for module in modules:
    try:
        exec 'import ' + module
    except ImportError:
        do_something()
Run Code Online (Sandbox Code Playgroud)


Pao*_*ino 6

这有什么问题?

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

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


sli*_*nkp 5

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

  • __import__('foo')无论是否保存对导入模块的引用,都会触发加载模块的任何副作用.这可能没关系,也可能没有.
  • find_module('foo') 不会引发任何副作用,所以它应该始终是安全的.
  • 如果找到模块但在加载时遇到其他问题(例如,SyntaxError,NameError,...),这两种方法都不能正常工作
  • 这取决于你如何处理失败,只是包裹__import__('foo')在一个try /除了会给你误导的结果,如果FOO被发现,但是这是富进口栏没有找到.
  • find_module()无法处理虚线名称,因此如果您需要检查是否可以导入'foo.bar.bat.baz',则必须根据文档多次调用find_module和load_module .