如何导入脚本列表?

djmepvbi  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(210)

假设我有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"]
3z6pesqy

3z6pesqy1#

好的,首先有几个免责声明:(1)动态导入模块可能是您实际需要的,也可能不是。我自己也这样做过,但在我的例子中,我有一个库,其中包含大约100个不同的模型,还有一个公共驱动程序,它根据我提供的命令行选项动态加载其中一个模型。主要的一点是,我从来都不需要一次加载多个模块,所以动态加载一个模块是有意义的。
(2)我远不是导入模块和包的Maven,但我通常能够让它做我想做的事情。
话虽如此,如果您认为动态导入模块是您想要的,那么这应该适合您。请注意,我试图为您创建一个完整的示例:

import importlib

files = [
    {"path" : "tools.tool_1", "name" : "tools__tool_1"},
    {"path" : "tools.tool_2", "name" : "tools__tool_2"},
    {"path" : "tools.tool_3", "name" : "tools__tool_3"}
]

module_dict = {}
main_dict = {}

for file_desc in files:
    path = file_desc["path"]
    name = file_desc["name"]

    module = importlib.import_module(path)

    module_dict[name] = module
    main_dict[name] = module.main

main_dict["tools__tool_1"]()

在本例中,有三个模块都位于目录中 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 详情如下:

main_dict["tools__tool_1"]()

如果要从调用它或任何其他函数 module_dict ,你可以:

module_dict["tools__tool_1"].main()

您基本上可以从中访问模块中的所有内容 module_dict ,但如果您只想访问 main ,那么你就可以 main_dict .
同样,这里可能比您需要的更多,但我不完全确定您打算如何使用它。如果你只需要其中一本字典,就把另一本扔掉。

fcipmucu

fcipmucu2#

您需要调用exec()函数。见下面的示例:

exec('from datetime import datetime')
print(datetime.now())

因此,在您的情况下,它将是:

for file in files:
    exec(f'from {file["path"]} import main as {file["alias"]}')

相关问题