首次打包Python软件,tox测试遇ModuleNotFoundError求助
你的问题核心出在包内模块的导入路径处理上——tox 运行测试时的隔离环境里,Python 没法正确识别同一个 sample 包下的 save_.py 模块。咱们一步步来解决:
问题根源拆解
你在 sample/project_name.py 里用了 from save_ import Save,这是绝对导入语法:Python 会在全局的 sys.path 里找名为 save_ 的顶层模块,但实际上 save_.py 是属于 sample 这个子包的模块,并非顶层模块。再加上 tox 环境的路径隔离特性,就导致了找不到模块的错误。
解决方案(按优先级排序)
1. 使用相对导入(推荐,符合 Python 包规范)
修改 sample/project_name.py 里的导入语句,改成相对当前包的导入方式:
# 从当前所在的 sample 包中导入 save_ 模块 from .save_ import Save
这里的 . 代表“当前包目录”,只要 sample 被识别为一个合法包(你已经添加了 __init__.py,满足要求),不管运行环境的路径如何,都能精准找到同包内的模块。
2. 使用完整绝对导入
如果你更习惯绝对导入的写法,可以把导入语句改成包含完整包路径的形式:
from sample.save_ import Save
这样 Python 会直接从 sample 包下查找 save_ 模块,只要项目根目录被加入到 sys.path 就能生效。
3. 调整 tox 配置确保路径正确
如果修改导入后还是报错,检查你的 tox.ini 是否正确配置了项目路径。可以添加以下配置:
[testenv] setenv = PYTHONPATH = {toxinidir} deps = -r requirements.txt # 有依赖文件的话加上这条 commands = pytest tests/ # 替换成你实际使用的测试命令
{toxinidir} 是 tox 的内置变量,指向你的项目根目录(也就是包含 sample 和 tests 的文件夹),这样 tox 运行时会自动把项目根目录加入到 Python 路径中。
4. 检查测试文件的导入笔误
看你的报错信息里,测试文件 test_project.py 写的是 import sample.project as pr,但你的模块实际是 sample/project_name.py,这里大概率是笔误,应该改成:
import sample.project_name as pr
模块名写错也会间接引发后续的导入连锁错误。
验证步骤
修改完成后,先在本地直接运行测试(比如 pytest tests/test_project.py),确认能正常执行后再跑 tox。如果本地能跑通但 tox 不行,那基本就是 tox 的路径配置问题,按照第3点调整即可。
内容的提问来源于stack exchange,提问作者6F4E37

