Spyder内置iPython控制台运行代码时锁定Windows文件资源管理器问题
Spyder 控制台运行代码后输出CSV文件被锁定问题解决
运行环境
- Spyder版本: 5.1.1 None
- Python版本: 3.7.9 64位
- Qt版本: 5.12.10
- PyQt5版本: 5.12.3
- 操作系统: Windows 10
问题表现
调用tkinter的filedialog选择输入文件,完成数据处理后将结果存储为CSV文件。多数情况下通过Windows文件资源管理器打开输出的CSV时,资源管理器会无响应,终止Spyder控制台进程后锁定立即解除。
在外部PowerShell/命令提示符运行代码,或是将Spyder运行配置设为「在外部系统终端中执行」时无该问题,仅在Spyder内置控制台调试时出现,Spyder 4.2.5版本也可复现该问题。
问题代码
import datetime import csv import tkinter as tk from tkinter import filedialog import xml.etree.ElementTree as ET from dateutil.relativedelta import relativedelta rt = tk.Tk() rt.withdraw() filePath = filedialog.askopenfilename() tree = ET.parse(filePath) root = tree.getroot() notesNodes = root.findall('.//Name[.="ScanNotes"]..') Notes = notesNodes[0][1].text Notes = Notes.rsplit('\n') def StoreCSV (filePointer, DataHeader, Data): localData =[] localData = Data.copy() localData.insert(0,DataHeader) # add header to file write = csv.writer(file) write.writerow(localData) csvfilePath = filePath +".csv" file = open(csvfilePath,'w',newline='') with file as writer: StoreCSV(file, 'Scan Notes', Notes)
根因分析
- Spyder内置的IPython控制台为交互式环境,代码执行完成后会保留所有全局变量的引用,原代码提前调用
open()创建文件对象,文件句柄被全局变量持有无法自动释放,Windows系统下进程持有文件句柄时文件会被锁定。 - StoreCSV函数存在变量引用错误,未使用传入的filePointer参数,直接引用全局file变量,进一步延长了文件对象的生命周期。
- tkinter的Tk实例仅调用了
withdraw()隐藏,未显式调用destroy()销毁,残留的GUI实例也会存在不必要的资源占用。
修复方案
- 修正文件操作逻辑,将open语句直接放在with上下文管理器内,避免生成全局文件对象:
csvfilePath = filePath +".csv" with open(csvfilePath,'w',newline='') as file: StoreCSV(file, 'Scan Notes', Notes)
- 修正StoreCSV函数的参数引用错误:
def StoreCSV (filePointer, DataHeader, Data): localData = Data.copy() localData.insert(0,DataHeader) write = csv.writer(filePointer) write.writerow(localData)
- 显式销毁tkinter实例,释放GUI资源:
rt = tk.Tk() rt.withdraw() filePath = filedialog.askopenfilename() rt.destroy() # 新增该行销毁Tk实例
- 调试阶段如果频繁运行代码,可在代码末尾手动删除不必要的全局变量,或定期重启Spyder控制台内核,彻底释放残留资源。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

