使用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_functest_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
相关产品推荐
相关产品推荐

