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

使用Pytest时Python项目模块导入报错问题求助

解决Python导入路径与pytest冲突问题

问题根源

你遇到的核心问题是Python运行时的工作目录差异:

  • 单独运行python /src/my_app/db.py时,Python自动把src/my_app目录加入sys.path,所以from config import my_func能找到同目录的config.py。
  • 用pytest运行时,默认会把项目根目录(包含src和tests的目录)加入sys.path,此时config.py所在的src/my_app不在直接搜索路径里,所以找不到模块;而你手动添加src目录到sys.path后,my_app变成了顶层模块,测试文件里写from src.my_app.db import就会报错——因为src已经是路径的一部分,不需要再作为模块前缀。

解决方案

方案1:统一使用绝对导入(推荐)

步骤1:把项目根目录加入Python路径

运行pytest前,先设置环境变量:

  • Linux/macOS终端:
    export PYTHONPATH=/path/to/your/project-root
    
  • Windows命令行:
    set PYTHONPATH=C:\path\to\your\project-root
    

(把/path/to/your/project-root替换成你实际的项目根目录,也就是包含src和tests的文件夹路径)

步骤2:修改导入语句

  • db.py里改成:
    from my_app.config import my_func
    
  • test_db.py里改成:
    from my_app.db import foo
    

方案2:使用相对导入(仅限包内部)

如果不想改环境变量,可以在db.py里用相对导入引用同目录的模块:

from .config import my_func

这样只要my_app是合法的Python包(有__init__.py),不管运行时的工作目录在哪,都能正确导入config.py。此时test_db.py的导入语句还是用方案1里的from my_app.db import foo,同样需要确保项目根目录在sys.path里(依赖pytest默认行为或环境变量设置即可)。

为什么不要硬编码sys.path?

你之前添加的sys.path.insert会导致路径冲突:把src目录加入路径后,my_app变成了顶层模块,测试文件里的from src.my_app.db import自然找不到src模块——因为src已经是搜索路径的一部分,直接写my_app.db才对。硬编码路径会让代码在不同运行环境下更脆弱,优先用环境变量或相对导入更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:05:05