You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:启动文件夹快捷方式

  1. 按下Win + R,输入shell:startup,回车打开用户专属的启动文件夹。
  2. 右键创建一个快捷方式,目标填写:
    C:\Python36\python.exe "C:\你的脚本路径\your_script.py"
    
    (注意替换成你实际的Python安装路径和脚本路径)
  3. 可以修改快捷方式的“运行方式”为“最小化”,避免开机弹出控制台窗口。

方式2:任务计划程序(更灵活)

适合需要后台运行、或不管用户是否登录都要启动的场景:

  1. 打开“任务计划程序”,点击“创建基本任务”。
  2. 触发器选择“当用户登录时”(或“启动时”,适合后台运行)。
  3. 操作选择“启动程序”,程序或脚本填python.exe的绝对路径(比如C:\Python36\python.exe),添加参数填你的脚本路径(比如"C:\你的脚本路径\your_script.py")。
  4. 可以在“设置”里勾选“如果任务运行时间超过XX时间就停止”(可选),以及“不管用户是否登录都要运行”(需要管理员权限)。

测试建议

测试的时候不用真的关机,用注销操作就能触发信号,检查文件是否正常关闭、内容是否完整,这样更高效。

内容的提问来源于stack exchange,提问作者Half_Bit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:57:38