有没有办法在 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
。需要更强信号才能杀死的程序很烦人。
我正在 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
。需要更强信号才能杀死的程序很烦人。