跨进程用cPickle序列化对象后,Windows删除临时文件遇Error 32
解决Windows下临时文件无法删除的Error 32问题
错误原因
Windows系统的文件锁定机制规定:只要有进程(包括当前进程)持有文件的未关闭句柄,该文件就无法被删除。你的进程1中,创建NamedTemporaryFile后仅提取了文件名,但未关闭原文件对象temp_file,导致文件句柄一直被占用,执行os.unlink时触发WindowsError: [Error 32](文件正在被另一个进程使用)。
修复方案
方案1:手动关闭临时文件句柄
创建临时文件后立即关闭对象,释放句柄,再传递文件名给进程2:
import cPickle from tempfile import NamedTemporaryFile from proc2 import create_and_send import os temp_file = NamedTemporaryFile(suffix='.ltree', delete=False) temp_file_name = temp_file.name temp_file.close() # 关键:关闭文件对象,释放句柄 create_and_send(temp_file_name) with open(temp_file_name, 'rb') as received_file: sent_obj = cPickle.load(received_file) os.unlink(temp_file_name)
方案2:使用with语句自动管理文件对象
利用with上下文管理器,离开代码块时自动关闭文件,无需手动调用close():
import cPickle from tempfile import NamedTemporaryFile from proc2 import create_and_send import os with NamedTemporaryFile(suffix='.ltree', delete=False) as temp_file: temp_file_name = temp_file.name # 离开with块后,文件已自动关闭 create_and_send(temp_file_name) with open(temp_file_name, 'rb') as received_file: sent_obj = cPickle.load(received_file) os.unlink(temp_file_name)
补充说明
进程2操作完临时文件后已经通过with语句关闭了文件句柄,所以问题不在进程2,完全是进程1自身未释放临时文件的初始句柄导致的。
内容的提问来源于stack exchange,提问作者IvanZharov
相关产品推荐
相关产品推荐

