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

Python项目中Pytest测试与主程序模块导入冲突的解决方法求助

如何让Python项目的主程序和测试都能正常处理模块导入?

你的问题核心是两种运行场景下Python的模块搜索路径(sys.path)不一致:

  • 直接运行python src/main.py时,src目录被加入sys.path,所以from b import sub_m能找到同目录的b.py
  • 运行测试时,项目根目录被加入sys.path,此时b.py属于src包下的模块,直接from b import ...会找不到

下面是几种可行的解决方法:

方案一:使用相对导入+包方式运行主程序(推荐)

修改src/main.py的导入语句为相对导入,表示从当前包(src)下的b模块导入:

from .b import sub_m

def add_m(a, b):
    return a + b

def add_sub(a, b):
    return add_m(a, b) + sub_m(a, b)


if __name__ == '__main__':
    print(add_m(5, 5))
    print(add_sub(5,5))

之后运行主程序时,要以包的方式启动(从项目根目录执行):

python -m src.main

测试代码无需修改,因为test/test_main.py中已经使用了绝对导入from src.main import ...,根目录在sys.path中,Python能正确识别src包,测试可以正常运行。

这种方式完全符合Python的包结构规范,长期维护更可靠。

方案二:设置PYTHONPATH环境变量

通过把项目根目录加入PYTHONPATH,让Python在两种场景下都能找到src包:

Linux/macOS

在终端执行(确保当前在项目根目录):

export PYTHONPATH=$(pwd):$PYTHONPATH

Windows(CMD)

set PYTHONPATH=%cd%;%PYTHONPATH%

Windows(PowerShell)

$env:PYTHONPATH = "$(Get-Location);$env:PYTHONPATH"

设置完成后:

  • 主程序可以修改为from src.b import sub_m,直接运行python src/main.py能正常工作
  • 测试命令pytest test也能正常执行

如果需要永久生效,可以把上述命令加入shell的配置文件(比如~/.bashrc、~/.zshrc)或者Windows的系统环境变量。

方案三:动态调整sys.path(不推荐)

在src/main.py开头添加代码,手动把项目根目录加入sys.path,强制Python识别src包:

import sys
import os

# 获取当前文件所在的src目录路径
src_path = os.path.dirname(os.path.abspath(__file__))
# 获取项目根目录(src的父目录)
root_path = os.path.dirname(src_path)

# 将根目录加入sys.path的最前面,确保优先搜索
if root_path not in sys.path:
    sys.path.insert(0, root_path)

from src.b import sub_m

def add_m(a, b):
    return a + b

def add_sub(a, b):
    return add_m(a, b) + sub_m(a, b)


if __name__ == '__main__':
    print(add_m(5, 5))
    print(add_sub(5,5))

这种方式属于“hack”式解决,虽然能生效,但会增加代码复杂度,不利于项目维护,仅作为临时方案使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:27:34