python-2.7 - 动态加载模块并在该模块中动态调用函数;蟒蛇 2.7
问题描述
我正在尝试编写 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"
... NameError 更改为“未定义名称'abc_fcn'”。
我究竟做错了什么?在此先感谢您的帮助!
解决方案
__import__
仅返回指定的模块,不会将其添加到全局命名空间。所以要完成你想要的,将结果保存为变量,然后动态检索你想要的函数。那可能看起来像
fcn_to_call = 'abc_fcn'
mod = __import__(module_to_import)
func = getattr(mod, fcn_to_call)
func()
附带说明一下,Abstract Base Classes builtin Python moduleabc
的名称,尽管我知道您可能只是在使用这个示例。
推荐阅读
- javascript - 我正在尝试创建一个动态表。我想让行数等于用户在框中输入的数字
- powershell - 如何将文件中的行与单个文件输出位置匹配
- python - 使用 MacBook 在 Atom 上安装 linter
- c# - 如何将客户端的 IP 地址转发到 Google Places Autocomplete API
- java - 使用适用于 Java 的 MongoDB 反应式驱动程序时将数据从反应式 DAO 返回到控制器的正确方法
- python - 使用 range() 索引 Numpy 数组会引发形状不匹配错误
- angular - 从大型数据库表读取的 Angular 项目在部署到 S3 时未正确加载值
- javascript - 如何通过下载文件
- swift - 为什么我的 if else 语句的 else 部分没有执行?
- javascript - Javascript ip地址比较