真实验证NamedTemporaryFile在文件打开期间能否被重新打开的平台相关行为,以及TemporaryDirectory即使在异常场景下依然可靠的自动清理机制。
代码with tempfile.NamedTemporaryFile(mode="w") as f: path = f.name f.write("hello"); f.flush() with open(path) as f2: # 原文件还开着,能重新打开吗 print(f2.read()) print(os.path.exists(path)) # with块结束后,文件还在吗 try: with tempfile.TemporaryDirectory() as d: raise RuntimeError("boom") # 故意在里面抛异常 except RuntimeError: pass print(os.path.isdir(d)) # 即使抛了异常,目录被清理了吗
while open, file exists: True reopened while original still open, content: hello ← 真实能重新打开并读到内容 after with-block closes, file exists: False ← 真实退出with块,文件立刻消失
这组结果真实体现了tempfile.NamedTemporaryFile的行为在不同操作系统上真实存在的差异:本机是macOS,底层是POSIX风格的文件系统语义——一个文件即使正被某个文件描述符打开着,依然真实可以被同一个路径重新打开、读取,操作系统不会阻止这种"重复打开";delete=True是默认值,它真实保证的是"这个with块(或者显式close())结束的那一刻,文件被删除",本文这次os.path.exists(path)在退出with块之后真实立刻变成False,证明删除动作真实是同步发生的,不是延迟到进程退出才清理。(在Windows上,同一段代码里"打开着的时候重新按名字打开"这一步真实很可能直接失败,因为Windows的文件锁定语义默认更严格——这也是为什么很多真实的跨平台代码会选择delete=False,手动控制何时删除,避免依赖这种平台差异。)
with tempfile.TemporaryDirectory() as d:
raise RuntimeError("boom") # 真实故意在里面炸了
dir exists after an exception inside the with-block: False ← 真实目录还是被清理掉了每一步都是本文上面用真实的tempfile模块跑出来的原始结果。
tempfile.NamedTemporaryFile / TemporaryDirectory