Bri*_*unt 7 python reflection import module python-module
考虑到模块的名称,如何测试是否安装了一组模块.例如
modules = set(["sys", "os", "jinja"])
for module in modules:
# if test(module exists):
# do something
Run Code Online (Sandbox Code Playgroud)
虽然可以将测试写成:
try:
import sys
except ImportError:
print "No sys!"
Run Code Online (Sandbox Code Playgroud)
这对我正在做的事情来说有点麻烦.有没有动态的方法来做到这一点?
我已经尝试了eval("import%s"%module),但是抱怨编译错误.
我很感谢你的想法和建议.谢谢.
你可以使用这样的__import__()函数::
for module in modules:
try:
__import__(module)
except ImportError:
do_something()
Run Code Online (Sandbox Code Playgroud)
您还可以使用它imp.find_module来确定是否可以在不导入模块的情况下找到模块::
import imp
for module in modules:
try:
imp.find_module(module)
except ImportError:
do_something()
Run Code Online (Sandbox Code Playgroud)
哦,你不能使用的原因eval()是因为import是一个陈述,而不是一个表达.你可以使用,exec如果你真的想,但我不推荐它::
for module in modules:
try:
exec 'import ' + module
except ImportError:
do_something()
Run Code Online (Sandbox Code Playgroud)
这有什么问题?
modules = set(["sys", "os", "jinja"])
for m in modules:
try:
__import__(m)
except ImportError:
# do something
Run Code Online (Sandbox Code Playgroud)
以上使用该__import__功能.此外,它正在严格测试它是否存在 - 它实际上并没有在任何地方保存导入,但你可以很容易地修改它来做到这一点.
值得理解find_module方法和__import__方法之间的权衡:
__import__('foo')无论是否保存对导入模块的引用,都会触发加载模块的任何副作用.这可能没关系,也可能没有.find_module('foo') 不会引发任何副作用,所以它应该始终是安全的.__import__('foo')在一个try /除了会给你误导的结果,如果FOO被发现,但是这是富进口栏没有找到.find_module()无法处理虚线名称,因此如果您需要检查是否可以导入'foo.bar.bat.baz',则必须根据文档多次调用find_module和load_module .| 归档时间: |
|
| 查看次数: |
3994 次 |
| 最近记录: |