tmp_path生成的文件在测试结束后消失是设计行为,因其为临时目录且测试结束自动清理;正确做法是所有i/o操作显式使用tmp_path路径,如tmp_path / "file.txt",并用read_text()/read_bytes()读取验证。

pytest的tmp_path为什么生成的文件在测试结束后就找不到了
因为tmp_path是pytest自动创建的临时目录,测试函数执行完立刻被清理——这不是bug,是设计行为。如果你在测试里用open("output.txt", "w")写到当前目录,那文件根本没进tmp_path,自然留不住,也验证不了。
正确做法是所有I/O操作都显式指向tmp_path下的路径:
- 用
tmp_path / "result.json"拼接路径(/是pathlib重载的运算符,不是字符串拼接) - 写文件时传
tmp_path / "data.csv"给open(),别用相对路径 - 读取时也必须从
tmp_path下读,不能靠os.chdir()切换工作目录——pytest不保证测试间cwd一致
怎么验证文件内容是否符合预期
别手动打开再读再断言。直接用tmp_path对象提供的方法:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
-
(tmp_path / "config.yaml").read_text()→ 返回str,适合文本校验 -
(tmp_path / "data.bin").read_bytes()→ 返回bytes,适合二进制或编码不确定场景 - 如果要校验JSON结构,先
json.loads((tmp_path / "out.json").read_text())再断言字段,别只比字符串 - 注意编码:默认
read_text()用UTF-8,如果代码里写了encoding="gbk",读的时候也得加对应参数
常见错误:用tmpdir和tmp_path混着写
tmpdir是旧版py.path对象,tmp_path是pathlib.Path,二者不兼容。以下写法会报错:
-
tmpdir.join("file.txt")→ 错,tmpdir已弃用,且和tmp_path类型冲突 -
str(tmp_path) + "/log.txt"→ 不推荐,绕过pathlib的安全路径处理,可能在Windows出反斜杠问题 - 把
tmp_path传给只接受str的老库(如某些subprocess调用)→ 必须显式转str(tmp_path),否则TypeError
大文件或多次写入时的注意事项
tmp_path本身没大小限制,但频繁创建/删除大文件会影响测试速度,且部分CI环境对临时磁盘空间敏感。
- 单次测试生成超过10MB文件?考虑用
tmp_path_factory做模块级fixture,复用目录避免重复IO - 写入后立即校验,别等测试末尾再统一读——中间出错时文件可能已被部分覆盖
- 如果程序内部硬编码了输出路径(比如写死
"./export/"),光靠tmp_path没用,得配合monkeypatch.setattr()或环境变量注入来劫持路径逻辑
临时路径不是魔法容器,它只管“给你一个干净目录”,具体往哪写、怎么读、编码怎么配,全得你代码里指得明明白白。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










