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

tox运行报错找不到bar模块,单模块包结构与配置咨询

关于单模块Python包的tox配置问题解答

1. 单模块包使用import bar是否为最佳实践?

是合理的最佳实践之一。如果你的包功能单一,不需要拆分多个子模块,直接import bar的方式更简洁,降低用户的使用成本,完全符合Python"简单优于复杂"的设计原则。

如果未来有扩展为多模块的计划,提前采用子包结构(如import foo.bar)会更利于后续迭代;但如果确定长期保持单模块形态,直接使用顶层模块导入是最优选择。

2. 将bar.py直接放在src目录是否规范?

完全规范。这种结构属于单模块src布局,符合Python打包的官方规范(如PEP 621)。只要配合正确的打包配置(如pyproject.toml),就能被setuptools、pip等工具正确识别和处理。

注意:src目录下建议保留__init__.py(即使是空文件),明确标识这是一个Python包目录;现在Python也支持无__init__.py的命名空间包,但单模块场景下保留__init__.py兼容性更好。

3. 如何调整tox配置解决ModuleNotFoundError?

报错的核心原因是tox的测试环境中,Python无法从src目录找到bar模块。需要同时调整打包配置和tox配置:

第一步:修正pyproject.toml打包配置

确保配置正确指向src目录下的单模块:

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "bar"
version = "0.1.0"
# 表示打包顶层模块(对应src目录下的内容)
packages = [""]
# 映射顶层模块到src目录
package-dir = {"": "src"}

第二步:调整tox.ini配置

让tox在测试前将当前包安装到测试环境,确保模块能被找到:

[tox]
envlist = py38,py39,py310,py311
# 跳过tox自带的sdist构建,直接用pip安装
skipsdist = true

[testenv]
# 安装测试依赖
deps = pytest
# 执行测试命令
commands = pytest tests/
# 关键:将当前包安装到测试环境
install_command = pip install .
# 如果需要开发模式(修改代码后无需重新安装),可以换成:
# install_command = pip install -e .

额外说明

不需要修改src/__init__.py做导入转发,因为src/bar.py本身就是顶层模块,测试文件test_bar.py中直接import bar即可正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:27:15