假设我有n个python文件(每个文件都有一个 main
函数)在这样的文件结构中:
tools \
|_ tool_1.py
|_ tool_2.py
...
|_ tool_N.py
此外,我的数据结构如下:
files = [
{"path":"tools/tool_1.py", "alias" : "tools__tool_1"}
{"path":"tools/tool_2.py", "alias" : "tools__tool_2"}
...
{"path":"tools/tool_N.py", "alias" : "tools__tool_N"}
]
如何将这些文件动态导入到单个python文件中?工具的数量将随着时间的推移而增加,手动为每个工具添加新行是不可行的。
那么,我如何将其转换为:
from tools.tool_1 import main as tools__tool_1
from tools.tool_2 import main as tools__tool_2
...
from tools.tool_N import main as tools__tool_N
这个?
for file in files:
from file["path"] import main as file["alias"]
2条答案
按热度按时间3z6pesqy1#
好的,首先有几个免责声明:(1)动态导入模块可能是您实际需要的,也可能不是。我自己也这样做过,但在我的例子中,我有一个库,其中包含大约100个不同的模型,还有一个公共驱动程序,它根据我提供的命令行选项动态加载其中一个模型。主要的一点是,我从来都不需要一次加载多个模块,所以动态加载一个模块是有意义的。
(2)我远不是导入模块和包的Maven,但我通常能够让它做我想做的事情。
话虽如此,如果您认为动态导入模块是您想要的,那么这应该适合您。请注意,我试图为您创建一个完整的示例:
在本例中,有三个模块都位于目录中
tools
. 模块是tool_1
,tool_2
,及tool_3
. 它们以名称导入并存储在词典中tools__tool_1
注:您可以简单地使用tool_1
等等,除非您需要使用tools__
因为您希望将其他目录中的模块加载到相同的字典中。请注意,这些导入都不会对全局命名空间产生任何影响。模块作为对象导入,并且
main
函数)仅存储在字典中。关于你需要什么,我不完全确定你想要什么,所以我创建了两本字典。首先是
module_dict
,它将导入整个模块。二是main_dict
,其中仅包含main
每个导入模块的函数,如原始帖子中所述。请注意,每个模块只导入一次。如果您只需要这些字典中的一个,那么只需删除您不需要的字典就足够简单了。无论如何,假设您要调用
main
从…起tools.tool_1
. 你可以从计算机上完成这项工作main_dict
详情如下:如果要从调用它或任何其他函数
module_dict
,你可以:您基本上可以从中访问模块中的所有内容
module_dict
,但如果您只想访问main
,那么你就可以main_dict
.同样,这里可能比您需要的更多,但我不完全确定您打算如何使用它。如果你只需要其中一本字典,就把另一本扔掉。
fcipmucu2#
您需要调用exec()函数。见下面的示例:
因此,在您的情况下,它将是: