我正在尝试编写 Python 2.7 代码,它将
- 启动时从配置文件动态加载模块列表/数组
- 从这些模块调用函数。这些函数也在配置文件中指定(可能是相同的配置文件,也可能是不同的配置文件(。
这个想法是我的代码在启动之前不知道要加载哪些模块。 调用函数的部分在运行时之前将不知道要调用哪些函数以及这些函数属于哪些模块。
我没有成功。 我的情况的一个简单例子是:
以下是 abc.py,一个应该动态加载的模块(在我的实际应用程序中,我会在配置文件的列表/数组中指定几个这样的模块(:
def abc_fcn():
print("Hello World!")
def another_fcn():
print("BlahBlah")
以下是应该加载 abc.py 的.py代码(我的实际代码需要从配置文件导入整个模块列表/数组(。此.py文件和 abc.py 都位于同一文件夹/目录中。请注意每个声明旁边的评论。
module_to_import = "abc" #<- Will normally come from config file
fcn_to_call = "abc.abc_fcn" #<- Will normally come from config file
__import__(module_to_import) #<- No error
print(help(module_to_import)) #<- Works as expected
eval(fcn_to_call)() #<- NameError: name 'abc' is not defined
当我将第二行更改为以下内容时...
fcn_to_call = "abc_fcn"
。名称错误更改为"未定义名称'abc_fcn'"。
我做错了什么? 提前感谢您的帮助!
__import__
只返回指定的模块,不会将其添加到全局命名空间中。因此,若要完成所需的操作,请将结果另存为变量,然后动态检索所需的函数。这可能看起来像
fcn_to_call = 'abc_fcn'
mod = __import__(module_to_import)
func = getattr(mod, fcn_to_call)
func()
附带说明一下,abc
是内置 Python 模块的抽象基类的名称,尽管我知道您可能只是使用这个示例。
您应该将返回值__import__
分配给变量abc
以便您可以实际将其用作模块。
abc = __import__(module_to_import)