游乐游手机版
首页/编程语言/文章详情

Python项目结构:src布局与tests分离

时间:2026-10-09 14:39
通过规范的src布局与独立tests目录组织Python项目,解决源码与测试代码混杂、导入路径不一致和打包发布时误包含测试代码等常见问题,并建立可验证、易维护的项目结构。

理解src布局与tests分离的项目结构

传统的Python项目常将源码直接置于根目录,导致测试文件、配置文件与业务代码混杂。采用src布局后,所有生产环境代码统一放入src/项目名/目录下,而tests/目录专门存放单元测试与集成测试脚本。这种分离的核心优势在于明确边界:src目录仅包含可发布的业务逻辑,tests目录仅负责验证。相比根目录布局,src布局能有效避免Python解释器在开发时意外将当前工作目录加入sys.path,从而防止隐式导入引发的路径冲突。此外,在构建分发包时,构建工具默认只打包src下的内容,彻底杜绝测试代码、临时脚本或敏感配置被误发布到PyPI的风险。规范的层级结构也为CI/CD流水线提供了清晰的执行上下文,使代码审查与依赖管理更加可控。

展示典型Python项目的src、tests、pyproject.toml等目录层级,并直观区分生产源码与测试代码。
终端中的Python项目目录树清晰展示了src源码目录、tests测试目录和pyproject.toml配置文件的分离结构。

创建标准src与tests目录并配置项目

从零搭建标准结构时,首先在项目根目录执行mkdir -p src/myapp tests,并在src/myapp下创建__init__.py与核心模块core.py。__init__.py可留空或定义包版本,core.py编写基础函数如def add(a, b): return a + b。随后在项目根目录创建pyproject.toml,使用现代构建系统配置项目元数据。例如采用setuptools时,需声明[build-system]依赖,并在[project]中定义名称、版本与依赖项。关键配置在于[tool.setuptools.packages.find],设置where = ["src"]以指示构建工具从src目录发现包。完成配置后,可通过pip install -e .进行可编辑安装,此时Python会将src/myapp映射到虚拟环境的site-packages中,确保开发期代码修改实时生效,同时保持目录结构的物理隔离。

展示真实Python项目文件树或终端中创建src、tests、pyproject.toml等文件的操作过程。
终端展示使用Poetry创建Python项目后生成README、源码包、pyproject.toml和tests目录的实际过程。

配置测试导入与运行方式

在src布局下,测试文件必须通过绝对包路径导入源码,例如在tests/test_core.py中直接编写from myapp.core import add。由于源码位于src子目录而非当前工作目录,若未安装项目,Python将无法解析该导入。因此,运行测试前需确保项目已通过pip install -e .安装至当前虚拟环境,或依赖pytest的自动发现机制配合正确的PYTHONPATH。推荐做法是在项目根目录直接执行pytest,此时pytest会读取已安装的包路径并正确加载模块。若出现ImportError,通常是因为未激活虚拟环境或未执行可编辑安装。为避免手动配置环境变量,可在pyproject.toml中配置[tool.pytest.ini_options],设置testpaths = ["tests"],并依赖构建工具处理路径映射,从而保证开发环境与测试执行环境的一致性。

展示真实终端运行pytest的结果,以及测试文件导入src下Python包的项目结构或测试执行过程。
PyCharm终端中的pytest执行结果显示测试被成功收集并通过,直观体现测试运行流程。

验证打包安装并排查常见路径问题

项目配置完成后,需验证打包边界是否符合预期。执行python -m build生成wheel文件后,可使用unzip -l dist/*.whl检查归档内容,确认仅包含src/myapp下的源码文件,而tests目录与开发配置文件均被排除。若安装后运行测试报ModuleNotFoundError: No module named 'myapp',通常由以下原因导致:一是虚拟环境未正确激活,导致site-packages路径未生效;二是pyproject.toml中packages.find的where参数配置错误,使构建工具未能正确识别src目录。排查时,可执行python -c "import sys; print(sys.path)"检查路径优先级,或使用pip show myapp确认安装位置。对于CI环境,建议在流水线中显式执行pip install -e .[dev]并清理缓存,确保测试依赖与运行环境严格对齐,从而消除本地与服务器之间的路径差异。

来源:workshop:8358941920a14a8ab2e74809f72755f7:site:2
上一篇组合模式与策略模式:别把结构嵌套和行为替换混为一谈 下一篇云安全实战:IAM 权限管理的核心原则与落地指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
用 pytest-benchmark 建立可复现的性能基线:从对比到回归
编程语言 · 2026-10-09

用 pytest-benchmark 建立可复现的性能基线:从对比到回归

本文介绍如何利用 pytest-benchmark 为 Python 代码建立可重复的性能基准,通过基准测试、对比分析和结果验证定位性能差异,同时避免测试环境、数据规模和统计方式带来的误判。

Python数据清洗:缺失值处理与异常值检测
编程语言 · 2026-10-09

Python数据清洗:缺失值处理与异常值检测

系统掌握使用Python与Pandas进行数据清洗的方法,从识别缺失值、选择合理的填补或删除策略,到检测异常值并验证清洗效果,避免因盲目处理导致数据偏差。

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理
编程语言 · 2026-10-09

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理

在 SQLAlchemy 开发中,Session 不仅是对象状态的跟踪器,更是数据库事务的边界载体。许多数据不一致问题源于对 Session 生命周期、事务提交机制及异常回滚的误解。本文从 Session 的工作单元本质出发,解析 flush 与 commit 的行为差异,探讨并发场景下的请求级 S

Redis 与 Memcached 选型指南:从架构差异到生产实践
编程语言 · 2026-10-09

Redis 与 Memcached 选型指南:从架构差异到生产实践

本文不单纯比较 QPS 峰值,而是从架构原理出发,解析 Redis 与 Memcached 在数据模型、内存管理与并发处理上的本质差异。通过统一环境的基准测试与真实业务场景分析,揭示在 Session 存储、复杂数据结构及高并发读写下的性能表现与瓶颈。文章最后提供针对缓存穿透、雪崩及大 Key 问题

Linux服务器初始化:防火墙与SELinux策略配置
编程语言 · 2026-10-09

Linux服务器初始化:防火墙与SELinux策略配置

从服务器初始化安全基线出发,系统梳理防火墙规则与SELinux策略的配置、验证、联动排障及常见避坑方法,帮助在保证服务可用的同时建立合理的访问控制边界。