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

