在Python中如何通过字符串调用模块和函数?
在Python中使用带函数名称的字符串调用模块函数向我们展示了如何使用getattr(“ bar ”)()调用函数,但是这里假设我们已经导入了模块foo 。
那么假设我们可能还必须执行foo的导入(或者从bar导入foo ),那么我们会如何去调用“foo.bar”的执行?
使用__import__(....)
函数:
http://docs.python.org/library/functions.html# 进口
(大卫几乎拥有它,但我认为他的例子更适合于如果你想重新定义正常的导入过程 - 例如从一个zip文件加载)
您可以使用imp
模块中的find_module
和load_module
加载在执行时确定其名称和/或位置的模块。
文档主题末尾的示例说明了如何:
import imp
import sys
def __import__(name, globals=None, locals=None, fromlist=None):
# Fast path: see if the module has already been imported.
try:
return sys.modules[name]
except KeyError:
pass
# If any of the following calls raises an exception,
# there's a problem we can't handle -- let the caller handle it.
fp, pathname, description = imp.find_module(name)
try:
return imp.load_module(name, fp, pathname, description)
finally:
# Since we may exit via an exception, close fp explicitly.
if fp:
fp.close()
这是我终于想出来的功能,我想从虚线名称中退出
from string import join
def dotsplit(dottedname):
module = join(dottedname.split('.')[:-1],'.')
function = dottedname.split('.')[-1]
return module, function
def load(dottedname):
mod, func = dotsplit(dottedname)
try:
mod = __import__(mod, globals(), locals(), [func,], -1)
return getattr(mod,func)
except (ImportError, AttributeError):
return dottedname
链接地址: http://www.djcxy.com/p/9405.html
上一篇: How is calling module and function by string handled in python?