В проектах на python у меня неоднократно возникала ситуация: виртуальное окружение развернуто давно, а пакеты внутри уже устарели.
Чтобы не держать руками список и не забывать про обновления, можно автоматизировать этот процесс.
1️⃣ Получение списка пакетов. В активированном окружении
pip list --outdated --format=freeze вернет пакеты, которые можно обновить:
source venv/bin/activate
pip list --outdated --format=freeze
2️⃣ Скрипт автообновления. Скрипт ищет все устаревшие пакеты и обновляет их до последней версии:
#!/bin/bash
set -euo pipefail
VENV_PATH="./venv"
source "$VENV_PATH/bin/activate"
echo "Проверяем устаревшие пакеты..."
outdated=$(pip list --outdated --format=freeze | cut -d= -f1)
if [[ -z "$outdated" ]]; then
echo "Все пакеты актуальны"
exit 0
fi
echo "Обновляем пакеты:"
for pkg in $outdated; do
echo " - $pkg"
pip install -U "$pkg"
done
3️⃣ Массовое обновление для проектов. Если проектов несколько, можно пройтись по каталогам и обновить все:
#!/bin/bash
for dir in ~/projects/*; do
if [[ -d "$dir/venv" ]]; then
echo "=== $dir ==="
source "$dir/venv/bin/activate"
pip list --outdated --format=freeze | cut -d= -f1 | xargs -n1 pip install -U
deactivate
fi
done
4️⃣ Фиксируем версии. Перед обновлением полезно сохранить текущие версии, чтобы в случае проблем легко откатиться:
pip freeze > requirements-$(date +%F).txt
BashTex 📱 #bash #utils