您好我希望使用Cmd模块在Python中创建嵌套解释器。
我设置了动态模块加载,因为我希望我的项目可以轻松扩展(即将新的python文件添加到文件夹中,而无需更改主代码可以加载它)。
我的嵌套解释器目前设置如下:
def instantiateConsole(base):
class SubConsole(cmd.Cmd, base):
def __init__(self):
cmd.Cmd.__init__(self)
def do_action(self,args):
print "Action"
return SubConsole
这是必要的,因为为了创建嵌套解释器,我必须将MainConsole作为第二个变量传递给SubConsole类。这样做的问题是,这样我只能在这个方法中创建类,我不能添加一个新的控制台模块文件,我可以动态加载,而不需要在这个方法中定义。
这有什么解决方法吗?
答案 0 :(得分:0)
当您说“将MainConsole作为第二个变量传递”时,您似乎意味着“将新的SubConsole作为MainConsole的子类”。您正在有效地定义一个以基类作为参数的类工厂。
您说“在此方法中创建类”,但在函数中显示instantiateConsole
。注意术语是很重要的。
这些与动态导入(包含)您可能希望用作instantiateClass
的参数的其他基类的模块无关。在最简单的情况下,您可以添加一个标准目录,这些模块将存放到您的sys.path
,按名称导入模块,然后提取基类(为简单起见,我假设将始终定义为{ {1}})。然后,您将运行
BaseConsole
如果基类的名称可能不同(您将如何确定其名称?),您可能必须优先使用extension_module = importlib.import_module("my_extension")
new_console = instantiateConsole(extension_module.BaseConsole)
来访问动态导入的扩展模块的简单属性。