Глава 23 · Часть III · Создаём Python-проект

pyproject.toml и установка проекта

src/safesort импортируется, pyproject.toml описывает Проект, а editable install связывает его с текущим окружением.

SafeSort · Часть 3 из 6Проект

Здесь легко смешать четыре разных объекта. Импортируемый пакет src/safesort/ содержит __init__.py и модули, которые Python загружает командой import safesort. Проект (project) — библиотека или приложение, предназначенное для упаковки; исходное дерево проекта (project source tree) — его файлы на диске: pyproject.toml, src/, tests/ и документация. Дистрибутивный пакет (distribution package) — устанавливаемый выпуск проекта; когда речь идёт о конкретном файле, это архив дистрибутива: wheel или sdist. Установленный проект — то, что появляется в окружении Python после установки: файлы импортируемого пакета плюс метаданные, по которым инструменты вроде pip и importlib.metadata узнают о нём.

Исходное деревопроектаpyproject.toml +src/safesort + testspython -m pipinstall -e .build frontend читаетметаданные проекта исвязывает src-layout…Установленныйпроект в…окружение знает, гденаходитсяимпортируемый пакетДва интерфейсаimport safesort икоманда safesort--help
pyproject.toml не превращает каталог в import package: он хранит метаданные проекта и настройки, по которым из исходного дерева собирают архивы дистрибутива (wheel/sdist)

При src-layout запуск Python из корня репозитория сам по себе не добавляет src/ в sys.path. Поэтому до установки import safesort обычно завершится ModuleNotFoundError. Это ожидаемое свойство раскладки, а не признак того, что __init__.py «не сработал».

pyproject.toml
[project]
name = "safesort"
version = "0.1.0"
description = "A safe, non-destructive command-line file organizer."
dependencies = []

[project.scripts]
safesort = "safesort.cli:main"

Поле version обязательно идентифицирует текущую версию пакета. Пока просто запишем 0.1.0 как номер первой учебной версии. Как устроены номера версий и почему здесь три числа, разберём ближе к завершению проекта.

Строка safesort = "safesort.cli:main" говорит инструменту установки: после установки создай в окружении команду safesort, которая вызывает функцию main() из модуля safesort.cli. Этого модуля пока не существует; мы напишем его на следующей странице.

Почему dependencies остаётся пустым
У SafeSort нет ни одной обязательной сторонней зависимости: pathlib, argparse, hashlib, shutil и json входят в стандартную библиотеку Python.

Устанавливаем проект в редактируемом режиме

Редактируемая установка (editable install) связывает окружение Python с исходным кодом проекта напрямую: изменения в файлах src/safesort/ становятся видны сразу, без повторной установки.

Терминал (окружение активировано)
python -m pip install -e ".[dev]"
python -c "import safesort; print(safesort.__file__)"
safesort --help
Официальная документация
Python Tutorial — Packages
Packaging Python Projects
Distribution package vs. import package
src layout vs flat layout
Writing pyproject.toml