Привіт, я Kernelka! Сьогодні покажу, як зробити стабільне та передбачуване середовище для Python у Linux: керуватимемо версіями через pyenv, ізолюватимемо залежності у venv та, за потреби, запакуємо все в Docker для 100% відтворюваності. Це мій базовий сетап для щоденної розробки — просто, надійно і швидко 🐍

Покроковий How‑to: pyenv + venv

1) Підготуємо інструменти збірки

На Ubuntu/Debian відкрийте термінал Linux і встановіть залежності для компіляції Python (потрібно для pyenv):

sudo apt update
sudo apt install -y \
  build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev \
  libsqlite3-dev curl git libncursesw5-dev xz-utils tk-dev \
  libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

Для інших дистрибутивів поставте еквівалентні пакети (наприклад, у Fedora — групи Development Tools і відповідні -devel бібліотеки).

2) Встановлюємо pyenv

pyenv дозволяє мати декілька версій Python паралельно — це мастхев для python в Linux.

curl https://pyenv.run | bash

# Додайте в ~/.bashrc або ~/.zshrc
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Перезапустіть оболонку або
source ~/.bashrc   # або ~/.zshrc

# Перевірка
pyenv --version

Тепер ставимо потрібну версію Python (наприклад 3.12.x) і робимо її локальною для проєкту:

pyenv install 3.12.7
mkdir -p ~/projects/myapp && cd ~/projects/myapp
pyenv local 3.12.7
python --version  # має показати 3.12.7

3) Створюємо ізольоване середовище venv

Кожен проєкт — свій віртуальний світ. Це стабільність і чистота залежностей у щоденній розробка на Linux рути ні.

python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip

# Встановлюємо залежності проєкту, якщо є файл
pip install -r requirements.txt  # або додавайте пакети по одному

# Фіксуємо точні версії для повторюваності
pip freeze > requirements.lock.txt

Порада: додайте .venv до .gitignore та зберігайте лише requirements.lock.txt або requirements.txt.

4) Зручні хелпери (не обов’язково)

  • Автоактивація: додаток direnv автоматично активує .venv при вході в теку проєкту.
  • Окремі інструменти: ставте утиліти для розробки через pipx, щоб не засмічувати venv.

Docker як шар броні

Коли важлива повна відтворюваність (на CI, продакшн, колективна робота) — Docker на Linux рятує. Не обов’язково писати Dockerfile для старту — можна використати офіційний образ Python:

# Запускаємо проєкт в контейнері з монтуванням коду
cd ~/projects/myapp
docker run -it --rm -v "$PWD":/app -w /app python:3.12-slim bash

# Всередині контейнера
pip install --upgrade pip
pip install -r requirements.txt
python -m pytest  # приклад команд
python app.py

Плюси: сталі версії, однаково працює на всіх машинах, легко повторити у CI/CD. Мінуси: трохи повільніше з файловими монтуваннями та більше місця на диску.

Альтернативні способи

  • Системний Python + venv: швидко, але обмежено версіями, що дає дистрибутив. Ризик «зламати» системні пакети.
  • Conda/Miniforge: зручно для наукових обчислень, де потрібні нативні бібліотеки. Мінус — важчі середовища.
  • asdf-vm: один менеджер версій для багатьох мов (Python/Node/Go). Якщо любите універсальність — ок.

GUI-спосіб: VS Code

Якщо більше любите кліки ніж конфіги — у VS Code все просто:

  1. Встановіть розширення Python.
  2. Відкрийте теку проєкту та оберіть інтерпретатор: Command Palette → Python: Select Interpreter → вкажіть .venv/bin/python.
  3. Для контейнерів поставте розширення Dev Containers: Command Palette → Dev Containers: Open Folder in Container → оберіть базовий Python контейнер.

Так ви отримуєте зручний GUI-інтерфейс і при цьому всю міць інструментів під капотом.

FAQ

pyenv не встановлює Python: помилки про OpenSSL/SQLite?

Ймовірно, бракує dev-пакетів. Перевірте, що встановили libssl-dev, zlib1g-dev, libsqlite3-dev, libbz2-dev, libffi-dev, libreadline-dev, xz-utils, tk-dev, liblzma-dev, libncursesw5-dev.

Після встановлення pyenv команда не знаходиться

Скоріш за все, ви не додали ініціалізацію у ~/.bashrc або не перезапустили сесію. Додайте рядки з інструкції та виконайте source ~/.bashrc.

Чим відрізняється pyenv global від pyenv local?

global змінює дефолтну версію Python для всього користувача, local записує потрібну версію в файл .python-version в поточній теці проєкту.

Де зберігати venv: в репозиторії чи ні?

Не зберігайте .venv у git. Краще тримати requirements.txt або requirements.lock.txt і відтворювати середовище.

У Docker інсталяція пакетів повільна

Кешуйте залежності: запускайте pip install --no-cache-dir лише коли справді треба; для локальної розробки використовуйте звичайний кеш, або збережіть теку ~/.cache/pip як volume.

Проблеми з правами у змонтованих тек (Linux)

Додайте запуск контейнера з вашим UID/GID: docker run -u $(id -u):$(id -g), щоб файли створювалися з правильними власниками.

Чи можна поєднати venv і Docker?

Для продакшн-образів краще без venv — просто система пакунків + pip у окремій текі. Для локальної розробки в контейнері venv не заважає, але й не обов’язковий.

Порада від Kernelka

Зробіть стартовий скрипт, щоб новачок у команді виконав одну команду і отримав все готове. Наприклад:

#!/usr/bin/env bash
set -euo pipefail

# 1) Переконатися, що є правильний Python через pyenv
PY=3.12.7
if ! pyenv versions --bare | grep -q "$PY"; then
  pyenv install "$PY"
fi
pyenv local "$PY"

# 2) Venv
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip

# 3) Залежності
if [ -f requirements.lock.txt ]; then
  pip install -r requirements.lock.txt
elif [ -f requirements.txt ]; then
  pip install -r requirements.txt
fi

echo "✅ Середовище готове!"

Так ви мінімізуєте помилки та прискорите онбординг. Маленький скрипт — велика економія часу 💡

Підсумок

  • pyenv дає паралельні версії Python без болю.
  • venv ізолює залежності для кожного проєкту.
  • Docker забезпечує відтворюваність середовища й простий перенос у CI/CD.
  • VS Code з Python/Dev Containers робить робочий процес зручним у GUI.
  • Фіксуйте версії залежностей і автоматизуйте старт скриптом.
  • Використовуйте термінал Linux для швидких дій і точного контролю.

Ось так я будую стабільний стек для Python в Linux: просто, повторювано і приємно. Якщо маєте питання — питайте в коментах!