使用Python中的嵌套解释器和Cmd模块退出到主级别

时间:2014-04-09 01:04:28

标签: python cmd

我在具有多级嵌套解释器的程序上使用Python Cmd模块。我希望能够从几个级别的解释器一直退回到主循环。这是我尝试过的:

import cmd

class MainCmd(cmd.Cmd):
    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = "MAIN> "

    def do_level2(self, args):
        level2cmd = Level2Cmd()
        level2cmd.cmdloop()

class Level2Cmd(cmd.Cmd):
    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = "LEVEL2> "
        self.exit = False

    def do_level3(self, line):
        level3cmd = Level3Cmd(self.exit)
        level3cmd.cmdloop()
        return self.exit

class Level3Cmd(cmd.Cmd):
    def __init__(self, exit_to_level_1):
        cmd.Cmd.__init__(self)
        self.prompt = "LEVEL3> "
        self.exit_to_level_1 = exit_to_level_1

    def do_back_to_level_1(self, args):
        self.exit_to_level_1 = True
        return True

################################################

if __name__ == '__main__':
    MainCmd().cmdloop()

当我运行程序时,导航到LEVEL3解释器并输入' exit_to_level_1'我只返回到level2。帮助

1 个答案:

答案 0 :(得分:1)

因此,它归结为可变类型与不可变类型。这是一个非常彻底的答案here。基本上,bool self.exit是不可变的;要将它传递给另一个对象并允许该对象进行更改,它需要以可变类型包装。

我们通过使用词典来恢复原状:

self.context = {"exit": False}

...并将上下文传递给子控制台。列表也可以正常工作。