Скрипт для быстрого перемещения python virtualenv

Зайчатки разума

Записная книжка айтишника

Скрипт для быстрого перемещения python virtualenv

2020-07-26 19:11:28 — Evgeniy Shumilov

  Уже в который раз сталкиваюсь с тем, что при перемещении какого-либо проекта из одной директории в другую при использовании virtualenv возникает проблема, связанная с тем, что при создании virtualenv в скрипты окружения прописываются абсолютные пути до интерпретаторов и всего прочего. Конечно, можно в старом окружении выгрузить список исопльзуемых библиотек через pip3 freeze > requirements.txt и потом в новом поставить библиотеки из списка через pip3 install -r requirements.txt, но такой подход занимает время, особенно если его использовать на одноплатных компьютерах, не отличающихся ни наличием быстрого flash накопителя, ни быстрого процессора, ни быстрого интернета. Особенно это актуально, когда в проекте несколько десятков тяжёлых библиотек и env весит под несколько сотен мегабайт. Сегодня мне это понадобилось для переноса директории с Home Assistant на OrangePi Zero. Решил, что "хватит это терпеть" и написал простой скриптик, который из activate получает старое значение VIRTUAL_ENV, из текущего положения - новое и заменяет его во всех файлах, где это необходимо. Всё оказалось достаточно просто. Проверил - работает. Скрипт необходимо положить в директорию, где расположен activate (не забываем выставить исполняемый бит через chmod +x scriptname). Ниже его содержимое.


#!/bin/sh
# Script for quick changing virtualenv path by Evgeniy Shumilov <evgeniy.shumilov@gmail.com>
# Just put it into venv path and run

cd `dirname "$0"`

! [ -f 'activate' ] && echo "Can't find activate script. Please put $0 into the virtualenv directory"

cdir=`pwd`
oldplace=`sed '/VIRTUAL_ENV=/!d;s/^.*=//;s/"//g' activate`
newplace="$(dirname `pwd`)"

[ "$oldplace" = "$newplace" ] && echo "Old place of virtualenv is equal to the newplace, stay unchanged" && exit 0
echo "Changing venv paths from $oldplace to the $newplace\n"
[ -d "__pycache__" ] && rm -rf __pycache__
for fn in `grep -Frn "$oldplace" --exclude='*.pyc' * | cut -d ":" -f 1 | sort -u`; do
    echo "Processing file $fn"
    sed -i 's#'"$oldplace"'#'"$newplace"'#g' $fn
done

Пример выполнения:

corpse@sh [18:52:53]:/opt/ha/bin$ ./changeplace
Changing venv paths from /home/corpse/ha to the /opt/ha

Processing file activate
Processing file activate.csh
Processing file activate.fish
Processing file aiopylgtvcommand
Processing file bellows
.... тут было ещё несколько десятков файлов ...
Processing file rst2html.py
Processing file rst2latex.py
Processing file rst2man.py

Теги: shell, python

comments powered by Disqus