如何在Python脚本的while True循环中检测CTRL-Z并执行退出前代码?
如何在while True循环中捕获CTRL-Z并执行退出前操作?
嘿,这个需求太普遍了!很多时候写无限循环的程序,都希望能优雅响应这类中断信号,而不是直接闪退导致清理逻辑没机会执行。下面分两种常见场景给你实用示例:
场景1:循环中需要读取用户输入(Windows环境为主)
在Windows里,按下CTRL+Z会触发EOFError(相当于输入结束),我们可以直接用try-except捕获这个异常,然后执行退出前的代码:
import sys while True: try: # 这里写你的主循环逻辑,比如读取用户输入 user_input = input("输入点什么(按CTRL+Z退出): ") print(f"你输入了: {user_input}") except EOFError: # 退出前的额外操作都写在这里 print("\n哦,检测到CTRL+Z了!开始执行退出前的清理...") print("比如:保存当前数据、关闭打开的文件、释放资源...") # 退出循环,结束程序 break
场景2:后台运行的循环(Unix/Linux环境)
在Unix/Linux系统中,CTRL+Z默认是发送SIGTSTP信号,把进程暂停到后台。如果想捕获这个信号并执行清理后退出,我们可以用signal模块覆盖默认行为:
import signal import sys import time # 定义信号处理函数,当收到SIGTSTP时执行 def handle_ctrl_z(signum, frame): print("\n捕获到CTRL+Z信号!准备优雅退出...") # 这里放你需要执行的额外代码 print("执行清理:保存运行状态、断开数据库连接...") # 退出程序 sys.exit(0) # 注册信号处理函数,把SIGTSTP绑定到我们定义的函数上 signal.signal(signal.SIGTSTP, handle_ctrl_z) while True: # 你的后台任务逻辑,比如定时检查、数据处理 print("程序正在运行...按CTRL+Z退出") time.sleep(1) # 模拟任务耗时,避免循环太占资源
小提示
- Windows和Unix系统对
CTRL+Z的处理不一样,上面的示例分别对应两种环境,你可以根据自己的系统选择适配。 - 如果只是想暂停进程而不是退出,那在Unix的信号处理函数里不要调用
sys.exit(),可以编写暂停相关的逻辑。
内容的提问来源于stack exchange,提问作者André C
相关产品推荐
相关产品推荐

