python动态来自模块导入函数的字符串

时间:2015-08-11 09:24:00

标签: python import

原始代码是(例如简化):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from utils.func_a import func_a as _func_a
from utils.func_b import func_b as _func_b
def func_a():
    _func_a()

def func_b():
    _func_b()

if __name__ == '__main__':
    func_a()

现在我只调用了func_a,或者func_b,它取决于配置。

所以我想动态做...导入...,例如:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def func_a():
    _func_a()

def func_b():
    _func_b()

if __name__ == '__main__':
    keys = ['func_a']
    for k in keys:
        mod_n = func_n = k
        from utils.<mod_n> import <func_n> as _<func_n>   # TODO
    func_a()

但我不知道如何实施它?

我想到的是在func_X()中导入:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def func_a():
    from utils.func_a import func_a as _func_a
    _func_a()

def func_b():
    from utils.func_b import func_b as _func_b
    _func_b()

if __name__ == '__main__':
    func_a()

但这种方式每次调用函数时都会导入。

补充:

我已尝试__import__ / importlib,但无法实施此条件

2 个答案:

答案 0 :(得分:2)

__import__是一个内置函数,它将模块名称作为字符串,并将模块作为对象返回。见the documentation

__import__(name[, globals[, locals[, fromlist[, level]]]])
     

该函数导入模块name,可能使用给定的globalslocals来确定如何解释包上下文中的名称。 fromlist给出了应该从name给出的模块导入的对象或子模块的名称。

答案 1 :(得分:0)

在我提出这个问题之前,我已尝试__import__importlib,但无法写出代码。

感谢@ machine-yearning,我阅读了__import__的整个文档。

这是我的解决方案:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
def func_a():
    _func_a()

def func_b():
    _func_b()

if __name__ == '__main__':
    keys = ['func_a']
    for k in keys:
        mod_n = func_n = k
        _temp = __import__('utils.'+mod_n, fromlist=[func_n])
        _func = getattr(_temp, func_n)
        new_func_n = '_{0}'.format(k)
        setattr(sys.modules[__name__], new_func_n, _func)

    func_a()