Python 隐式导入

Python Implicit Import

我希望在 python 中构建一个简单的构建系统来获得乐趣。受到 gradle 的启发,我的目标是让多个文件存储有关任务的信息(类似于 build.gradle 文件)。例如,单个构建文件可能如下所示:

from commands import *
tasks = {
    "Project1": {
        "dependencies": [
            "Project2"
        ],
        "commands": [
            ShellCommand("echo I am building Project1")
        ]
    },
    "Project2": {
        "commands": [
            ShellCommand("echo I am building Project2")
        ]
    }
}

我可以通过 importlib.import_module(module_name) 动态加载一堆格式相似的文件,以创建所有任务的主列表,并根据该列表进行处理。

我 运行 遇到的困难部分是找到一种干净的方式来支持这些任务文件中的命令(例如 ShellCommand)。我可以为所有命令编写包装器,将它们放在一个 commands.py 文件中,然后导入它。但是,导入语句很混乱,任务编写者不应该要求它。

显而易见的(我希望是幼稚的)解决方案是读取每个任务文件并在导入文件不存在的情况下预先添加。有没有更清洁的方法来做到这一点?

TL;DR: 我想在动态加载文件时用隐式导入替换显式 from commands import *

虽然通常不推荐,但它可能适合您的用例,即创建某种领域特定语言。

只需在导入模块之前将命令设为内置变量即可:

__builtin__.ShellCommand = ShellCommand
__builtin__.ShellCommand2 = ShellCommand2

从现在开始,ShellCommandShellCommand2 在您的 运行 程序中随处可用。