首页 > 解决方案 > 有没有办法永远不会在 python 中的 KeyboardInterrupt 上退出?

问题描述

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

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

当用户按下 CTRL-C 时,我没有退出程序,而是试图让它打印“请键入 exit 退出”并返回到while True. 我现在有这样的事情:

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

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

标签: pythonpython-3.xkeyboardinterrupt

解决方案


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

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 时,将执行KeyboardInterrupt该函数,而不是引发异常。handler这是一个基本示例,自定义处理程序中的代码以执行您想要的操作。

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


推荐阅读