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

跨进程用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:03:21