Python隐式导入

时间:2018-01-30 23:04:41

标签: python python-3.x import implicit

我希望在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文件中,然后导入它。但是,import语句很混乱,任务编写者不应该要求它。

显而易见的(我希望天真的)解决方案是读取每个任务文件并在导入(例如尚不存在)之前添加。有更清洁的方法吗?

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

1 个答案:

答案 0 :(得分:0)

虽然通常不推荐,但对于您的用例可能没问题,即创建某种特定于域的语言。

只需在导入模块之前使命令内置变量:

__builtin__.ShellCommand = ShellCommand
__builtin__.ShellCommand2 = ShellCommand2

从现在开始,ShellCommandShellCommand2随处可用。