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

Posted

技术标签:

【中文标题】在 Python 中以编程方式检查模块可用性?【英文标题】:Checking for module availability programmatically in Python? 【发布时间】:2011-02-06 17:51:38 【问题描述】:

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

我尝试了以下但不正确:

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

谢谢。

【问题讨论】:

@wRAR:因为 "os = 'sys'; import os" 试图导入 os,而不是 sys。 为什么要检查而不是仅仅导入模块并让默认机制来做它的事情? 【参考方案1】:

现在,在问题发生 10 多年后,在 Python >= 3.4 中,要走的路是使用importlib.util.find_spec

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

这个机制就是他们preferred over 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 版本,请查看 how to check if a python module exists without importing it

【讨论】:

【参考方案2】:

您可以同时使用__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)

如果您确实只想检查可用性,而不是(尚未)加载模块,尤其是对于需要一段时间加载的模块,这会大大加快速度。但是请注意,第二种方法仅专门检查 模块 是否存在 - 它不会检查可能需要的任何其他模块的可用性(因为正在检查的模块尝试 @ 987654327@其他模块加载时)。根据您的具体规格,这可能是加号或减号!-)

【讨论】:

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

【讨论】:

以上是关于在 Python 中以编程方式检查模块可用性?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 iPhone 中查找可用内存?

以编程方式检查 SD 卡是不是可用

如何以编程方式检查 Android 中互联网连接的可用性?

检查是不是有新的 Windows 版本可用并以编程方式安装

以编程方式检查 redshift 集群状态

在 C# 中以编程方式设置 Windows XP Embedded 区域设置