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

pytest中将tmp_path内容复制到tmp_path_factory报错如何解决

错误根因

报错核心是tmp_path_factory为pytest提供的临时路径工厂实例,本身不属于可被文件系统识别的路径对象,不能直接作为路径参数传入shutil.copytree,需要先调用它的mktemp()方法生成实际可用的临时目录路径。
除此之外你当前的代码还存在一个隐藏问题:未提前创建tmp_path / "me"目录就直接执行复制操作,即使解决工厂类型的报错,也会触发源路径不存在的异常。

修复方案

推荐使用对应作用域的fixture管理跨测试共享的临时目录,这是pytest官方推荐的最佳实践,修复后代码如下:

import pytest
import shutil

# 模块级fixture,整个测试模块内只会生成一次共享目录
@pytest.fixture(scope="module")
def shared_test_dir(tmp_path_factory):
    # 调用mktemp生成实际的临时目录Path对象
    return tmp_path_factory.mktemp("shared_data")

def test_1(tmp_path, shared_test_dir):
    # 先生成test_1的文件树
    test_1_data_dir = tmp_path / "me"
    test_1_data_dir.mkdir()
    # 这里可替换为你实际的文件树生成逻辑
    (test_1_data_dir / "demo.txt").write_text("测试数据")
    
    # 将生成的文件树复制到共享目录
    shutil.copytree(test_1_data_dir, shared_test_dir / "me", dirs_exist_ok=True)
    assert True

def test_2(shared_test_dir):
    # 直接读取共享目录下的文件树作为输入
    file_list = list(shared_test_dir.rglob("*"))
    print(file_list)
    # 示例验证逻辑
    assert (shared_test_dir / "me" / "demo.txt").read_text() == "测试数据"
注意事项
  • tmp_path_factory.mktemp(自定义目录名)返回的是标准Path类型对象,兼容所有需要路径参数的文件操作函数
  • 可根据共享范围调整fixture的scope参数:scope="session"表示整个测试会话内共享,scope="module"表示单个测试文件内共享,scope="class"表示单个测试类内共享
  • 执行shutil.copytree前需要确保源路径存在且为目录类型,避免触发路径不存在异常

内容的提问来源于stack exchange,提问作者GlaceCelery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:48:00