测试正在安装的Python模块依赖项
给定模块的名称,如何测试是否安装了一组模块。例如测试正在安装的Python模块依赖项,python,reflection,import,module,python-module,Python,Reflection,Import,Module,Python Module,给定模块的名称,如何测试是否安装了一组模块。例如 modules = set(["sys", "os", "jinja"]) for module in modules: # if test(module exists): # do something 虽然可以将测试写成: try: import sys except ImportError: print "No sys!" 这对我正在做的事情来说有点麻烦。有没有一种动态的方法可以做到这一点 我尝试过eval(“导入%
modules = set(["sys", "os", "jinja"])
for module in modules:
# if test(module exists):
# do something
虽然可以将测试写成:
try:
import sys
except ImportError:
print "No sys!"
这对我正在做的事情来说有点麻烦。有没有一种动态的方法可以做到这一点
我尝试过eval(“导入%s”%module),但它抱怨编译错误
我很感谢你的想法和建议。谢谢。这个怎么了
modules = set(["sys", "os", "jinja"])
for m in modules:
try:
__import__(m)
except ImportError:
# do something
上面使用的是函数。此外,它正在严格测试它是否存在-它实际上并没有将导入保存到任何地方,但您可以轻松地修改它来实现这一点。您可以使用如下函数:
for module in modules:
try:
__import__(module)
except ImportError:
do_something()
您还可以使用确定是否可以在不导入模块的情况下找到模块:
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()
有必要了解find_模块方法和
导入方法之间的权衡:
\uuuuu import\uuuu('foo')
将触发加载模块的任何副作用,无论您是否保存对导入模块的引用。这可能是好的,也可能不是
find_模块('foo')
不会引发任何副作用,因此它应该总是安全的
- 如果找到了模块,但在加载时存在其他问题(例如SyntaxError、NameError等),则这两种方法都不能很好地工作
- 根据您处理失败的方式,如果在try/except中简单地包装
\uuuuuu import\uuuu('foo')
,如果找到了foo,但foo导入了未找到的条,则会产生误导性的结果
find_module()
无法处理虚线名称,因此如果需要检查是否可以导入'foo.bar.bat.baz',则必须使用多个调用来查找_模块并按照
modules = set(["sys", "os", "jinja"])
try:
for module in modules:
__import__(module)
doSomething()
except ImportError, e:
print e