考虑到模块的名称,如何测试是否安装了一组模块。 E.g。
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),但是抱怨编译错误。
我很感激你的想法和建议。谢谢。
答案 0 :(得分:8)
您可以使用__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()
答案 1 :(得分:6)
这有什么问题?
modules = set(["sys", "os", "jinja"])
for m in modules:
try:
__import__(m)
except ImportError:
# do something
以上使用__import__
功能。此外,它正在严格测试它是否存在 - 它实际上并没有在任何地方保存导入,但你可以很容易地修改它来做到这一点。
答案 2 :(得分:5)
值得理解find_module方法和__import__
方法之间的权衡:
__import__('foo')
都会触发加载模块的任何副作用。那可能没问题。find_module('foo')
不会触发任何副作用,因此它应该始终是安全的。__import__('foo')
包装在try / except中,如果找到foo但会导致错误的结果,但是找不到 的foo导入栏。find_module()
无法处理虚线名称,因此如果您需要检查是否可以导入'foo.bar.bat.baz',则必须根据{{使用多次调用find_module和load_module 3}} 答案 3 :(得分:2)
modules = set(["sys", "os", "jinja"])
try:
for module in modules:
__import__(module)
doSomething()
except ImportError, e:
print e