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

5 投票
4 回答
2683 浏览
提问于 2025-04-15 21:29

假设你有一个模块名称的列表,比如说 mymods = ['numpy', 'scipy', ...],那么你怎么检查这些模块是否可用呢?

我试过下面的方法,但不对:

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

谢谢。

4 个回答

0

现在,距离这个问题提出已经超过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')

这个方法比 使用 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模块是否存在

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'>
>>>
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 其他模块)。根据你的具体需求,这可能是个优点,也可能是个缺点!

撰写回答