src 布局与扁平布局#

“扁平布局”是指将项目的各个文件组织在一个文件夹或存储库中,以便各种配置文件和 导入软件包 都位于顶级目录中。

.
├── README.md
├── noxfile.py
├── pyproject.toml
├── setup.py
├── awesome_package/
│   ├── __init__.py
│   └── module.py
└── tools/
    ├── generate_awesomeness.py
    └── decrease_world_suck.py

“src 布局”通过将打算导入的代码(即 import awesome_package,也称为 导入软件包)移动到子目录中,从而偏离了扁平布局。此子目录通常命名为 src/,因此称为“src 布局”。

.
├── README.md
├── noxfile.py
├── pyproject.toml
├── setup.py
├── src/
│    └── awesome_package/
│       ├── __init__.py
│       └── module.py
└── tools/
    ├── generate_awesomeness.py
    └── decrease_world_suck.py

以下是 src 布局和扁平布局之间重要行为差异的细分

  • src 布局要求安装项目才能运行其代码,而扁平布局则不需要。

    这意味着 src 布局涉及项目开发工作流中的一个附加步骤(通常, 可编辑安装 用于开发,而常规安装用于测试)。

  • src 布局有助于防止意外使用正在开发的代码副本。

    这一点很重要,因为 Python 解释器将当前工作目录包含为导入路径中的第一项。这意味着,如果当前工作目录中存在与已安装导入软件包同名的导入软件包,则将使用当前工作目录中的变体。这可能导致项目打包工具的配置出现细微错误,从而导致文件未包含在发行版中。

    src 布局通过将导入软件包保存在与项目根目录分开的目录中来避免这种情况,从而确保使用已安装的副本。

  • src 布局有助于强制 可编辑安装 只能导入打算导入的文件。

    当可编辑安装使用 路径配置文件(将目录添加到导入路径)实现时,这一点尤其重要。

    扁平布局将添加其他项目文件(例如:README.mdtox.ini)以及打包/工具配置文件(例如:setup.pynoxfile.py)到导入路径中。这将使某些导入在可编辑安装中起作用,但在常规安装中不起作用。