Windows关机时如何让Python 3.6程序优雅退出并关闭文件?
如何让Windows下的Python 3.6程序捕获关机信号并优雅关闭文件
刚好之前折腾过类似需求,给你梳理一套靠谱的方案,分信号处理和开机启动两部分来说:
一、捕获Windows关机/注销信号,优雅关闭文件
Windows下Python标准库的signal模块对系统关机信号支持有限,我们可以借助pywin32库来处理控制台的系统控制信号,实现优雅退出。
步骤1:安装适配Python 3.6的pywin32
因为Python 3.6比较老,新版本pywin32已经不再支持它,所以需要指定兼容版本安装:
pip install pywin32==227
步骤2:编写信号处理代码
下面是完整的示例代码,注释里写清楚了逻辑:
import win32api import win32con import sys import time # 全局变量存储文件对象,方便在信号处理函数中访问 my_file = None def system_signal_handler(dw_ctrl_type): global my_file # 捕获关机或注销信号 if dw_ctrl_type in (win32con.CTRL_SHUTDOWN_EVENT, win32con.CTRL_LOGOFF_EVENT): print("收到系统关机/注销信号,开始优雅退出...") # 关闭文件(如果已打开) if my_file is not None: my_file.close() print("文件已安全关闭") # 主动终止程序,避免被系统强制杀掉 sys.exit(0) # 保留对Ctrl+C信号的默认处理(可选) elif dw_ctrl_type == win32con.CTRL_C_EVENT: print("收到Ctrl+C信号,退出程序") if my_file is not None: my_file.close() sys.exit(0) # 返回True表示已处理该信号,系统不会再做默认处理 return True def main(): global my_file try: # 打开目标文本文件(这里以追加模式为例,根据你的需求调整) my_file = open("your_target_file.txt", "a+", encoding="utf-8") print("程序启动,文件已打开") # 注册系统信号处理函数 win32api.SetConsoleCtrlHandler(system_signal_handler, True) # 模拟你的持续运行逻辑 while True: # 这里替换成你的业务代码,比如写入内容到文件 my_file.write(f"程序运行中:{time.strftime('%Y-%m-%d %H:%M:%S')}\n") my_file.flush() # 强制把缓存写入磁盘,避免数据丢失 time.sleep(2) except Exception as e: print(f"程序运行异常:{str(e)}") # 异常时也要确保文件关闭 if my_file is not None: my_file.close() sys.exit(1) if __name__ == "__main__": main()
代码说明
win32api.SetConsoleCtrlHandler:注册控制台的控制信号处理函数,能捕获关机、注销、Ctrl+C等系统信号。- 信号处理函数中优先关闭文件,再主动调用
sys.exit(0)让程序正常结束,避免Windows强制终止导致文件损坏。 - 业务逻辑中加入
flush():因为Python文件操作默认有缓存,直接关闭前如果没flush,可能部分内容还在内存里没写入磁盘。
二、设置程序开机自动启动
Windows下有两种简单的开机启动方式,根据你的需求选:
方式1:启动文件夹快捷方式
- 按下
Win + R,输入shell:startup,回车打开用户专属的启动文件夹。 - 右键创建一个快捷方式,目标填写:
(注意替换成你实际的Python安装路径和脚本路径)C:\Python36\python.exe "C:\你的脚本路径\your_script.py" - 可以修改快捷方式的“运行方式”为“最小化”,避免开机弹出控制台窗口。
方式2:任务计划程序(更灵活)
适合需要后台运行、或不管用户是否登录都要启动的场景:
- 打开“任务计划程序”,点击“创建基本任务”。
- 触发器选择“当用户登录时”(或“启动时”,适合后台运行)。
- 操作选择“启动程序”,程序或脚本填
python.exe的绝对路径(比如C:\Python36\python.exe),添加参数填你的脚本路径(比如"C:\你的脚本路径\your_script.py")。 - 可以在“设置”里勾选“如果任务运行时间超过XX时间就停止”(可选),以及“不管用户是否登录都要运行”(需要管理员权限)。
测试建议
测试的时候不用真的关机,用注销操作就能触发信号,检查文件是否正常关闭、内容是否完整,这样更高效。
内容的提问来源于stack exchange,提问作者Half_Bit
相关产品推荐
相关产品推荐

