测试正在安装的 Python 模块依赖项
Posted
技术标签:
【中文标题】测试正在安装的 Python 模块依赖项【英文标题】:Test for Python module dependencies being installed 【发布时间】:2010-10-20 14:09:38 【问题描述】:在给定模块名称的情况下,如何测试是否安装了一组模块。例如
modules = set(["sys", "os", "jinja"])
for module in modules:
# if test(module exists):
# do something
虽然可以将测试写成:
try:
import sys
except ImportError:
print "No sys!"
这对我正在做的事情来说有点麻烦。有没有动态的方法来做到这一点?
我尝试了 eval("import %s"%module) 但抱怨编译错误。
感谢您的想法和建议。谢谢。
【问题讨论】:
【参考方案1】:这是怎么回事?
modules = set(["sys", "os", "jinja"])
for m in modules:
try:
__import__(m)
except ImportError:
# do something
以上使用__import__
函数。此外,它正在严格测试它是否存在 - 它实际上并没有将导入保存在任何地方,但您可以轻松修改它来做到这一点。
【讨论】:
【参考方案2】:你可以像这样使用__import__()
函数::
for module in modules:
try:
__import__(module)
except ImportError:
do_something()
您也可以使用imp.find_module
来确定是否可以在不导入模块的情况下找到模块::
import imp
for module in modules:
try:
imp.find_module(module)
except ImportError:
do_something()
哦,你不能使用eval()
的原因是import
是一个语句,而不是一个表达式。你可以使用exec
,如果你真的想要的话,虽然我不推荐它::
for module in modules:
try:
exec 'import ' + module
except ImportError:
do_something()
【讨论】:
【参考方案3】:modules = set(["sys", "os", "jinja"])
try:
for module in modules:
__import__(module)
doSomething()
except ImportError, e:
print e
【讨论】:
【参考方案4】:值得了解 find_module 方法和 __import__
方法之间的权衡:
__import__('foo')
将触发加载模块的任何副作用,无论您是否保存对导入模块的引用。这可能没问题,也可能不行。
find_module('foo')
不会触发任何副作用,因此它应该始终是安全的。
如果模块被找到但在加载时有其他问题(例如,SyntaxError、NameError、...),这两种方法都不能正常工作
根据您处理失败的方式,如果找到了 foo 但 foo 导入了 未 找到的 bar,则简单地将 __import__('foo')
包装在 try/except 中会给您带来误导性结果。
find_module()
无法处理带点的名称,因此如果您需要检查 'foo.bar.bat.baz' 是否可以导入,您必须按照docs. 多次调用 find_module 和 load_module
【讨论】:
以上是关于测试正在安装的 Python 模块依赖项的主要内容,如果未能解决你的问题,请参考以下文章