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

Cookiecutter模板测试中模块导入失败问题求助

解决Cookiecutter模板测试中的模块导入问题

你的问题根源在于{{cookiecutter.project_slug}}是Cookiecutter的模板占位符,Python解析导入语句时会把{{cookiecutter当成模块名的一部分,而非等待模板实例化后的真实项目名。以下是几种可行的解决思路:

思路1:先实例化模板再测试

Cookiecutter的模板变量只有在生成实际项目后才会被替换,所以测试前需要先生成一个测试用的项目实例,再导入模块:

import os
import sys
import shutil
from cookiecutter.main import cookiecutter

def test_repository_structure():
    # 定义测试参数
    test_slug = "test_project_demo"
    output_dir = "./temp_test_project"

    # 从当前模板生成测试项目
    cookiecutter(
        template="./",
        output_dir=output_dir,
        no_input=True,
        extra_context={"project_slug": test_slug}
    )

    # 将生成的项目路径加入Python搜索路径
    project_path = os.path.join(output_dir, test_slug)
    sys.path.insert(0, project_path)

    # 正常导入模块并测试
    try:
        import make_repository_structure as mrs
        # 这里添加你的测试逻辑,比如验证函数存在或结构生成正确
        assert hasattr(mrs, "generate_structure")
        assert callable(mrs.generate_structure)
    finally:
        # 清理临时测试文件
        shutil.rmtree(output_dir)

思路2:直接执行脚本内容而非导入模块

如果不需要完整的模块导入,可直接读取模板中的脚本文件内容,用exec执行后测试逻辑:

import os

def test_script_functionality():
    # 指向模板中的脚本文件
    script_path = os.path.join("{{cookiecutter.project_slug}}", "make_repository_structure.py")
    with open(script_path, "r", encoding="utf-8") as f:
        script_content = f.read()

    # 模拟模板实例化后的环境,执行脚本
    local_namespace = {}
    exec(script_content, globals(), local_namespace)

    # 测试脚本中的核心功能
    assert "generate_structure" in local_namespace
    # 示例:调用函数生成Python包结构并验证
    local_namespace["generate_structure"]("python_package")
    # 这里可添加文件/目录存在性检查(需注意路径,建议结合临时目录)

思路3:结合Pytest临时目录(更优雅的方式)

利用Pytest的tmp_path fixture自动管理临时目录,避免手动清理:

import os
import sys
import pytest
from cookiecutter.main import cookiecutter

@pytest.fixture
def instantiated_project(tmp_path):
    # 在临时目录生成测试项目
    test_slug = "test_pytest_demo"
    cookiecutter(
        template="./",
        output_dir=str(tmp_path),
        no_input=True,
        extra_context={"project_slug": test_slug}
    )
    return os.path.join(tmp_path, test_slug)

def test_module_import(instantiated_project):
    # 添加临时项目路径到搜索路径
    sys.path.insert(0, instantiated_project)
    # 导入模块并测试
    import make_repository_structure as mrs
    assert mrs.generate_structure("data_science") is not None
    # 可继续添加结构验证逻辑

关键注意事项

  • 确保测试时当前工作目录是Cookiecutter模板的根目录(即包含cookiecutter.json的目录)。
  • 若使用cookiecutter库,需提前安装:pip install cookiecutter。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:30:39