在 Python 中以编程方式检查模块可用性?
给定模块名称列表(例如 mymods = ['numpy', 'scipy', ...]),我如何检查模块是否可用?
我尝试了以下方法,但这是不正确的:
for module_name in mymods:
try:
import module_name
except ImportError:
print "Module %s not found." %(module_name)
谢谢。
given a list of module names (e.g. mymods = ['numpy', 'scipy', ...]) how can I check if the modules are available?
I tried the following but it's incorrect:
for module_name in mymods:
try:
import module_name
except ImportError:
print "Module %s not found." %(module_name)
thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以使用
__import__
函数,如 @Vinay 的答案,和try
/except
,如您的代码:或者,要仅检查可用性但不实际加载模块,您可以使用标准库模块imp:
如果您想做只想检查可用性,而不是检查可用性,这会快得多(还)加载模块,特别是那些需要一段时间才能加载的模块。但请注意,第二种方法仅专门检查模块是否存在 - 它不会检查可能需要的任何其他模块的可用性(因为正在检查的模块尝试<代码>导入其他模块加载时)。根据您的具体规格,这可能是一个优点或缺点!-)
You could use both the
__import__
function, as in @Vinay's answer, and atry
/except
, as in your code:Alternatively, to just check availability but without actually loading the module, you can use standard library module imp:
this can be substantially faster if you do only want to check for availability, not (yet) load the modules, especially for modules that take a while to load. Note, however, that this second approach only specifically checks that the modules are there -- it doesn't check for the availability of any further modules that might be required (because the modules being checked try to
import
other modules when they load). Depending on your exact specs, this might be a plus or a minus!-)使用 __import__ 函数:
Use the
__import__
function:如今,在问题提出 10 多年后,在 Python >= 3.4 中,正确的方法是使用
importlib.util.find_spec
:这个机制就是他们优先于
imp.find_module
:对于旧的 Python 版本,还可以查看如何检查 python 模块无需导入即可存在
Nowadays, more than 10 years after the question, in Python >= 3.4, the way to go is using
importlib.util.find_spec
:This mechanism is them preferred over
imp.find_module
:For old Python versions also look how to check if a python module exists without importing it
在最近的 Python 版本 (>= 3.4) 中,如果无法导入
foo
,importlib.util.module_from_spec('foo')
将返回None
,换句话说,不可用。此检查不会实际导入模块。
更多信息:
importlib.util.module_from_spec
文档In recent Python versions (>= 3.4),
importlib.util.module_from_spec('foo')
will returnNone
iffoo
cannot be imported, in other words, unavilable.This check will not actually import the module.
More info:
importlib.util.module_from_spec
documentation