python - 有没有办法永远不会在 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 后的任何其他程序一样存在一堆乱七八糟的文本。这可以解决吗?
解决方案
更好的方法是注册一个信号处理程序:
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
在此处调用。需要更强信号才能杀死的程序很烦人。
推荐阅读
- spring - Spring Cloud Data Flow 监控阻止任务完成
- python - Applying map function to OO method call
- windows - find the status of the hotfixes installed in the system using WMI/ Win32
- python - 如何通过某个步骤生成随机数?
- vue.js - Swiper doesn't work correctly when looping (last and first slides are empty)
- javascript - localhost 没有发送任何数据 ERR_EMPTY_RESPONSE
- powershell - 用于远程计算机的 Powershell Get-Volumn
- r - Matching a dataset with the closest neighbour in another dataset
- javascript - 让子函数递归
- object - Delphi编译器错误?使用“对象”,但使用“记录”编译