在Python中使用嵌套解释器和Cmd模块返回主级别

1 投票
1 回答
876 浏览
提问于 2025-04-18 01:57

我在一个使用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 个回答

1

这其实是关于可变类型和不可变类型的区别。简单来说,布尔值 self.exit 是不可变的;如果想把它传给另一个对象并让那个对象修改它,就得把它放在一个可变的类型里。

我们通过使用字典来解决这个问题:

self.context = {"exit": False}

... 然后把这个上下文传给子控制台。其实用列表也可以达到同样的效果。

撰写回答