如何构建Python包以同时支持代码运行与测试?
问题根源
当直接运行src/module1.py时,Python会将脚本所在的src/目录加入sys.path,而非项目根目录,因此无法识别src作为顶级包;而测试时从项目根目录执行pytest,根目录在sys.path中,src.module2能被正常解析。以下是几种同时满足脚本执行和测试的方案:
方案1:使用-m参数运行脚本(快速生效)
- 保持src内部模块使用绝对导入,例如
module1.py中:from src.module2 import some_func, some_other_func - 不要直接执行
python src/module1.py,而是在项目根目录运行:
此命令会将项目根目录加入python -m src.module1sys.path,让Python正确识别src包,测试时仍在根目录执行pytest即可。
方案2:配置pytest自动加载src路径(适配相对导入)
- 将src内部模块改为相对导入,
module1.py中:from .module2 import some_func, some_other_func - 在项目根目录创建
pytest.ini文件,添加以下内容:
这样pytest会自动把[pytest] pythonpath = srcsrc目录加入sys.path,测试时能直接找到module2;直接执行python src/module1.py时,src目录默认在sys.path中,相对导入也能正常工作。
方案3:转为可安装包(长期规范方案)
- 在项目根目录创建
pyproject.toml:[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-project" version = "0.1.0" packages = ["src"] - 执行开发模式安装:
安装后,无论是运行pip install -e .python -m src.module1还是执行pytest,所有导入都会被正确解析,这是Python项目的标准实践,适合长期维护。
简化操作的工具
- 使用
poetry或pipenv这类项目管理工具,它们会自动处理路径和依赖,创建项目时生成规范结构:
生成的项目结构自带合规的src和测试目录,导入与测试问题无需手动配置即可解决。poetry new your-project
内容的提问来源于stack exchange,提问作者user27208364
相关产品推荐
相关产品推荐

