Python脚本批量修改Desktop文件夹文件运行无响应冻结问题咨询
问题描述
使用Python脚本批量写入修改位于「Desktop」文件夹内的文件时,脚本会在处理约10-15个文件后无响应冻结,该现象与文件类型无关,仅和脚本修改的文件数量相关。
若将待修改文件移出Desktop文件夹(路径C:\Users\User\Desktop),或者通过CMD以管理员权限运行Python脚本,则不会出现冻结问题。
补充测试说明
该行为与特定文件无关,测试了随机选取的各类文件,删除此前导致冻结的文件后,脚本依然会在处理相同数量的文件后冻结;删除前9个已成功处理的文件后,脚本可以正常修改此前导致冻结的文件,但依然会在处理约10-15个文件后再次冻结。
触发冻结的示例代码如下:
root = ... for path, subdirs, files in os.walk(root): for name in files: file = (os.path.join(path, name)) print("1") with open(file, 'r+b') as f: #脚本在此处冻结 print("2") #与文件类型无关 f.seek(1) #但循环迭代到10-15次左右就会停止 f.write(b'\x0a')
运行环境
Python 3.10,近期更新的Windows 10系统,已关闭Windows Defender。
其他测试结果
- 将with上下文管理替换为手动
open()+close()写法,无法解决问题。 - 测试过.txt、.css、.bin等不同格式的文件,均会出现该冻结问题,触发冻结时处理的文件数量在10-20区间波动。
咨询问题
为什么该现象发生时没有任何异常、错误抛出,也没有系统通知?是什么原因导致脚本冻结?为什么冻结会在成功修改10-20个文件后才出现?
解答
根因分析
- 无报错的原因:该问题属于Windows内核级的文件系统IO阻塞,不属于Python应用层的语法或逻辑错误,系统默认不会将IO等待状态向上抛给应用进程,因此脚本只会进入无响应的阻塞状态,不会输出错误信息也不会触发系统通知。
- 仅桌面目录触发、管理员权限可规避的原因:Windows 10的桌面目录属于用户受保护的系统路径,会被资源管理器、桌面搜索索引服务、快速访问组件等多个系统进程持续持有共享句柄。普通权限的Python进程发起文件写入请求时,需要和这些系统进程的句柄抢占调度权限,连续发起的IO请求会进入排队队列。
- 固定次数后冻结的原因:系统为普通用户进程分配的桌面目录IO排队槽位阈值就在10~20区间,槽位被占满后新的
open()请求就会进入无限等待状态,因此现象和文件类型无关,仅和请求数量挂钩。
解决方案
执行
chkdsk /f命令后重启系统即可解决该问题。
chkdsk /f会自动修复桌面所在分区的文件系统逻辑错误,清理异常残留的句柄缓存、损坏的目录索引项,重启后系统会重建桌面目录的权限配置和IO调度规则,即可恢复正常的文件写入能力。
内容的提问来源于stack exchange,提问作者Kent
相关产品推荐
相关产品推荐

