如何动态导入python模块函数?

时间:2010-08-31 05:15:56

标签: python function import module

假设my_function()位于my_apps.views中,我想动态导入my_function,而不使用execeval之类的内容。

无论如何都要做到这一点。我想做类似的事情:

my_function = import_func("my_apps.views.my_function")

my_function()
   ... code is executed

4 个答案:

答案 0 :(得分:24)

你想要

my_function = getattr(__import__('my_apps.views'), 'my_function')

如果您在编译时碰巧知道函数的名称,可以将其缩短为

my_function = __import__('my_apps.views').my_function

这将加载my_apps.views,然后将其my_function属性分配给本地my_function

如果您确定只需要一个功能,那么这是可以接受的。如果您需要多个属性,可以执行以下操作:

views = __import__('my_apps.views')
my_function = getattr(views, 'my_function')
my_other_function = getattr(views, 'my_other_function')
my_attribute = getattr(views, 'my_attribute')

因为它更具可读性,可以为您节省一些__import__的来电。再次,如果你知道名字,代码可以缩短如上。

您也可以使用imp模块中的工具执行此操作,但它更复杂。

答案 1 :(得分:9)

请注意,Python 2.7添加了importlib module__import__()的便利包装和3.1功能的后端。

  

此模块是Python 3.1中功能更全面的包中提供的一小部分,它提供了完整的导入实现。这里提供了什么来帮助轻松地从2.7过渡到3.1。

     

importlib.import_module(name, package=None)

     

导入模块。 name参数指定以绝对或相对术语导入的模块(例如pkg.mod或..mod)。如果名称是以相对术语指定的,那么必须将package参数指定给作为解析包名称的锚点的包(例如import_module('.. mod','pkg.subpkg')将导入pkg的.mod)。指定的模块将插入到sys.modules中并返回。

答案 2 :(得分:1)

我刚刚写了这段代码,看起来很多人都需要,所以即使以后我也会展示它

def my_import(module_name,func_names = [],cache = False):
    if module_name in globals() and cache:
        return True
    try: 
        m = __import__(module_name, globals(), locals(), func_names, -1)
        if func_names:
            for func_name in func_names:
                globals()[func_name] = getattr(m,func_name)
        else:
            globals()[module_name] = m
        return True
    except ImportError:
        return False
def my_imports(modules):
    for module in modules:
        if type(module) is tuple:
            name = module[0]
            funcs = module[1]
        else:
            name = module
            funcs = []
        if not my_import(name, funcs):
             return module
    return ''

def checkPluginsImports(plugin,modules):
    c = my_imports(modules)
    if c:
        print plugin +" has errors!: module '"+c+"' not found"

# example: file test.py with "x" function
def d():
    checkPluginsImports('demoPlugin',[('test',['x'])])

d()
x()

答案 3 :(得分:0)

.text-area > .scroll-pane{

-fx-hbar-policy:never;
-fx-vbar-policy:never; 

}