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

如何实现KeyboardInterrupt后完成当前迭代再终止Python解压程序?

优雅实现中断后完成当前ZIP解压的方案

可以利用Python的信号处理机制实现需求,无需额外创建检测文件,也不会留下半解压文件。核心思路是捕获终止信号(比如Ctrl+C触发的SIGINT),设置终止标志,让程序完成当前迭代后再退出。

具体实现代码

import os
import zipfile
import signal

# 全局终止标志
should_terminate = False

def sigint_handler(signum, frame):
    global should_terminate
    print("\n收到终止指令,将完成当前文件解压后退出")
    should_terminate = True

# 注册SIGINT信号处理函数,替换默认的中断行为
signal.signal(signal.SIGINT, sigint_handler)

zip_folder = "zips"
for zip_file in os.listdir(zip_folder):
    # 每次迭代开始前检查是否需要终止
    if should_terminate:
        break
    
    path_zip_file = os.path.join(zip_folder, zip_file)
    with zipfile.ZipFile(path_zip_file, "r") as zip_ref:
        zip_ref.extractall("extract_folder")
    
    os.remove(path_zip_file)
    print(f"处理完成: {zip_file}")

print("程序已退出")

关键说明

  • 信号处理逻辑:按下Ctrl+C时,系统发送SIGINT信号,处理函数仅设置终止标志,不会立即中断程序,避免当前解压过程被打断。
  • 迭代检查机制:每次进入新文件处理前,先检查终止标志,若已触发则直接退出循环,确保当前文件的解压、删除操作完整执行。
  • 原子性保障:保持原代码先完成extractall再删除原ZIP文件的顺序,保证只有文件完全解压后才会清理原归档,不会留下半解压文件或残留ZIP。

若需处理其他终止信号(如SIGTERM),只需额外注册对应的信号处理函数即可,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:17:19