tmp_path未清理说明它根本没被使用:常见错误包括硬编码路径、字符串拼接、跨测试保存引用或混用tmpdir,正确做法只能是用tmp_path / "file"生成子路径并操作。

tmp_path 在测试结束后没有自动清理,基本可以断定:它根本没被用上。
不是 pytest 失效了,而是你写的代码绕过了 tmp_path 的生命周期管理机制。
你是不是在写文件时没用 tmp_path?
常见错误是直接用相对路径或绝对硬编码路径:
-
open("output.log", "w")→ 文件写进当前工作目录(可能是项目根目录),和tmp_path无关 -
Path("/tmp/myfile.txt").write_text("x")→ 写到系统/tmp,pytest 不管 -
os.path.join(tempfile.gettempdir(), "data.json")→ 手动拼路径,绕过 fixture 管理
这些操作创建的文件,pytest 完全不知道,自然不会清理。
你是不是把 tmp_path 转成了字符串再拼接?
比如这样写:
path = str(tmp_path) + "/config.yaml"
Path(path).write_text("...")
问题在于:str(tmp_path) 返回的是路径字符串,但后续用 Path(...) 构造的新对象,和原始 tmp_path fixture 实例已无关联。pytest 只认你函数签名里声明的那个 tmp_path 参数所指向的 pathlib.Path 实例——它只清理这个实例及其子路径(通过 / 运算符生成的)。
正确写法只有这一种:
config_file = tmp_path / "config.yaml"
config_file.write_text("...")
你是不是在测试函数外保存了 tmp_path 引用?
tmp_path 是函数级 fixture,生命周期仅限于单个测试函数执行期间。如果做了这类事:
-
global_saved_path = tmp_path(模块级变量) -
class TestBase: path = tmp_path(类属性) - 在 fixture 中返回
tmp_path并被其他测试复用
那该引用会变成悬空对象:目录其实已被删,但变量还指着旧路径,后续读写会报 FileNotFoundError 或静默失败(比如写到已删目录的父级)。
你是不是用了 tmpdir 或混用了旧版 API?
tmpdir 返回的是已弃用的 py.path.local 对象,和 tmp_path(pathlib.Path)不兼容。如果你的测试同时出现两者:
def test_x(tmp_path, tmpdir): ...- 用
tmpdir.join("x.txt")但期望tmp_path清理它
那清理只会作用于 tmp_path 下的路径,tmpdir 创建的内容得自己收尾——而且 tmpdir 本身也只在函数退出时清理自己的目录,但类型不同、路径不同、互不感知。
真正要让清理“发生”,唯一条件是:所有文件 I/O 都基于函数参数里的那个 tmp_path 实例,用 / 拼出路径,然后读写。别的路,都等于没进 pytest 的清理流水线。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











