tempfile.mkstemp()安全创建唯一临时文件,返回(fd, path)元组,fd需用os.fdopen()包装成文件对象;默认权限0o600,windows忽略权限;必须手动关闭fd并删除path,否则残留。

用 tempfile.mkstemp() 创建唯一临时文件
直接调用 tempfile.mkstemp() 是最稳妥的方式——它原子性地创建文件并返回句柄和路径,确保不会因竞态条件覆盖或冲突。注意它返回的是 (fd, path) 元组,fd 是操作系统级文件描述符,不是 Python 的 file 对象。
- 必须手动用
os.fdopen(fd, 'w')包装成可读写的文件对象,否则写入会失败 - 文件默认权限是
0o600(仅当前用户可读写),Windows 上忽略权限参数 - 不要传入已存在的
prefix或suffix组合导致路径过长,尤其在 Windows 下易触发OSError: [Errno 22] Invalid argument - 示例:
import tempfile, os fd, path = tempfile.mkstemp(suffix='.log', prefix='app-', dir='/tmp') with os.fdopen(fd, 'w') as f: f.write('hello')
用 tempfile.TemporaryDirectory() 安全管理临时目录
需要整个目录结构时,TemporaryDirectory 是唯一推荐方式:上下文管理器自动清理,即使中间异常退出也不会残留空目录。
- 它不保证目录名绝对唯一(底层仍依赖
mkdtemp()),但冲突概率极低;若需强约束,可传入自定义prefix+suffix - 不能在
__exit__后继续访问目录内容——一旦退出with块,目录已被递归删除,再访问会报FileNotFoundError - 避免在目录内创建硬链接或绑定挂载,
shutil.rmtree()清理时可能失败 - 示例:
with tempfile.TemporaryDirectory(prefix='cache-') as tmpdir: with open(f'{tmpdir}/config.json', 'w') as f: f.write('{}')
为什么不用 os.tmpnam() 或手动拼接 /tmp/xxx-$$
这些做法看似简单,实则危险:os.tmpnam() 已被标记为 deprecated,且不保证路径未被占用;手动拼接更糟——存在竞态窗口:检查路径不存在 → 另一进程创建同名文件 → 当前进程覆写或失败。
-
tempfile.mkstemp()和mkdtemp()底层调用系统mkstemp(3)/mkdtemp(3),由内核保证原子性 - 哪怕指定
dir='/tmp',也要注意某些容器环境/tmp是内存文件系统(tmpfs),空间不足时会直接OSError: No space left on device - 跨平台时别硬编码路径分隔符,始终用
os.path.join(tmpdir, 'file')或pathlib.Path(tmpdir) / 'file'
临时文件没被自动删除?检查是否漏掉 delete=False
tempfile.NamedTemporaryFile() 默认 delete=True,但一旦设为 False,就完全不会自动清理——这是最常被忽略的陷阱。
- 设
delete=False通常是为了让子进程也能访问该文件(因为NamedTemporaryFile创建的文件在 Windows 上无法被其他进程打开),但你必须自己记下.name并显式os.unlink() - 如果用
NamedTemporaryFile写完数据后直接关闭,又没保存.name,就彻底丢失路径,无法清理 - 更安全的替代:优先用
mkstemp()+os.fdopen(),路径明确可控
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











