在Python中以编程方式检查模块可用性?

5

给定一个模块名称列表(例如 mymods = ['numpy','scipy',...]),我该如何检查这些模块是否可用?

我尝试了以下代码,但不正确:

for module_name in mymods:
  try:
    import module_name
  except ImportError:
    print "Module %s not found." %(module_name)

thanks.


1
@wRAR:因为“os = 'sys'; import os”尝试导入的是os,而不是sys。 - ojrac
为什么你想要检查而不是只导入模块并让默认机制自行处理呢? - Mike Graham
4个回答

10

您可以使用__import__函数(就像@Vinay的答案中一样)一个try/except语句(就像您自己的代码中一样):

for module_name in mymods:
  try:
    __import__(module_name)
  except ImportError:
    print "Module %s not found." %(module_name)

另外,要仅检查可用性但不实际加载模块,您可以使用标准库模块imp

import imp
for module_name in mymods:
  try:
    imp.find_module(module_name)
  except ImportError:
    print "Module %s not found." %(module_name)

如果你只想检查可用性而不加载模块,特别是对于需要加载一段时间的模块,使用这种方法会更快。请注意,第二种方法仅检查模块本身是否存在--它不检查可能需要的任何其他模块的可用性(因为在加载它们时尝试import其他模块)。根据您的确切规格,这可能是一个优点或缺点!-)


3

使用__import__函数:

>>> for mname in ('sys', 'os', 're'): __import__(mname)
...
<module 'sys' (built-in)>
<module 'os' from 'C:\Python\lib\os.pyc'>
<module 're' from 'C:\Python\lib\re.pyc'>
>>>

0

如今,在Python >= 3.4中,超过10年的提问后,使用importlib.util.find_spec是前进的方式:

import importlib
spec = importlib.util.find_spec('path.to.module')
if spam:
    print('module can be imported')

这个机制比 imp.find_module 更受欢迎:

import importlib.util
import sys


# this is optional set that if you what load from specific directory
moduledir="d:\\dirtest"

```python
try:
    spec = importlib.util.find_spec('path.to.module', moduledir)
    if spec is None:
        print("Import error 0: " + " module not found")
        sys.exit(0)
    toolbox = spec.loader.load_module()
except (ValueError, ImportError) as msg:
    print("Import error 3: "+str(msg))
    sys.exit(0)

print("load module")

对于旧版本的Python,还可以查看如何在不导入模块的情况下检查Python模块是否存在


0
在最近的Python版本(>= 3.4)中,importlib.util.module_from_spec('foo')如果无法导入foo,将返回None,换句话说,不可用。 这个检查不会实际导入模块。
import importlib.util
if importlib.util.find_spec('foo') is None:
    # module foo cannot be imported
    pass
else:
    # module foo can be imported
    pass

更多信息:
  1. importlib.util.module_from_spec 文档
  2. 示例代码,用于在检查以下两个条件后导入模块:1)尚未导入;2)可以导入。

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