Изолируй каждый проект в собственном venv, фиксируй зависимости и придерживайся воспроизводимой структуры проекта.
Открыть этот урок в KodokonУстановка зависимостей всех твоих проектов в один интерпретатор ведёт прямиком к конфликту версий: проекту A нужен requests 2.31, проекту B - несовместимая версия. Виртуальное окружение (venv) изолирует каждый проект: свой интерпретатор, свой pip, свои пакеты. Это профессиональная практика без права на компромисс - один проект, одно окружение, воспроизводимое один в один на любой машине.
python -m venv .venv
source .venv/bin/activate
# On Windows:
# .venv\Scripts\activate
python -m pip install requests
python -m pip listЧтобы установка была воспроизводимой, зафиксируй версии. pip freeze выгружает всё окружение, включая транзитивные зависимости, с точными версиями: максимум воспроизводимости, мучительные обновления. Современный подход разделяет две потребности: прямые зависимости объявляются в pyproject.toml со свободными ограничениями, а lock-файл генерируется для точной установки. В масштабе небольшого проекта requirements.txt остаётся вполне достойным вариантом.
python -m pip freeze > requirements.txt
# On another machine:
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txtЧто до структуры, эталон - это src layout: код лежит в src/<package>/, тесты в tests/, конфигурация в pyproject.toml. Смысл папки src не косметический: она не даёт случайно импортировать локальный пакет из текущей директории, что скрыло бы ошибки упаковки - твои тесты работают с реально установленным пакетом. Во время разработки pip install -e . ставит проект в редактируемом режиме.
mkdir -p src/billing tests
touch src/billing/__init__.py
touch src/billing/invoices.py
touch tests/test_invoices.py
touch pyproject.toml README.md .gitignore
echo ".venv/" >> .gitignore