有没有办法在 python 的 KeyboardInterrupt 上永不退出?

Is there a way to never exit on KeyboardInterrupt in python?

我正在 python 中创建一种交互式命令行。我有这样的东西:

def complete_menu():
    while True:
        cmd = input('cmd> ')
        if cmd == "help":
            print('help')
        elif cmd == "?":
            print('?')

当用户按下 CTRL-C 时,我没有退出程序,而是试图让它打印 "please type exit to exit" 并返回到 while True。我现在有这样的东西:

if __name__ == "__main__":
    try:
       main()
    except KeyboardInterrupt:
        print('Please use exit to exit')
        complete_menu()

虽然这可行,但存在许多问题。首先,当第一次按下 CTRL-C 时,它会打印出文本并完美运行。但是,当用户第二次按下 CTRL-C 时,它会像按下 CTRL-C 后的任何其他程序一样出现一堆乱七八糟的文本。这可以修复吗?

你快到了。这应该可以解决问题:

if __name__ == "__main__":
    while True:
        try:
            main()
        except KeyboardInterrupt:
            print('Please use exit to exit')
            complete_menu()

更好的方法是注册一个信号处理程序:

import signal

def handler(signum, frame):
    print("Please use exit to exit")
    # or: just call sys.exit("goodbye")

...

def main():
    signal.signal(signal.SIGINT, handler)  # prevent "crashing" with ctrl+C
    ...


if __name__ == "__main__":
    main()

现在,当您的代码中收到 Ctrl+C 时,将执行函数 handler,而不是引发 KeyboardInterrupt 异常。这是一个基本示例,自定义处理程序中的代码来执行您想要的操作。

注意:我的建议是实际上让用户使用Ctrl+C退出 ,即执行您可能需要 运行 的任何清理代码,然后在此处调用 sys.exit。需要更强信号才能杀死的程序很烦人。