原始代码是(例如简化):
#!/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
,但无法实施此条件
答案 0 :(得分:2)
__import__
是一个内置函数,它将模块名称作为字符串,并将模块作为对象返回。见the documentation:
__import__(name[, globals[, locals[, fromlist[, level]]]])
该函数导入模块
name
,可能使用给定的globals
和locals
来确定如何解释包上下文中的名称。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()