在Python中如何通过字符串调用模块和函数?

在Python中使用带函数名称的字符串调用模块函数向我们展示了如何使用getattr(“ bar ”)()调用函数,但是这里假设我们已经导入了模块foo

那么假设我们可能还必须执行foo的导入(或者从bar导入foo ),那么我们会如何去调用“foo.bar”的执行?


使用__import__(....)函数:

http://docs.python.org/library/functions.html# 进口

(大卫几乎拥有它,但我认为他的例子更适合于如果你想重新定义正常的导入过程 - 例如从一个zip文件加载)


您可以使用imp模块中的find_moduleload_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?

下一篇: Delete an item from a dictionary