-
-
Save linxlunx/5e9c10873e033e665d6368e5070ba1ed to your computer and use it in GitHub Desktop.
Script to rebuild virtualenv after upgrading the python version
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# This script is for rebuilding the virtualenv when using virtualenvwrapper | |
# Sometimes the virtualenv is broken after upgrading the python version | |
# Inspired from https://gist.github.com/pujianto/7df2413d64480f7797e1f0c434841283 | |
# | |
# Usage: | |
# $ ./venv_upgrade.sh | |
# Input your virtualenvs base directory then select the virtualenv you want to rebuild | |
if [ "`command -v pip`" == "" ]; then | |
echo "pip is not installed" && exit | |
fi | |
# check virtualenvwrapper installed | |
VIRTUALENVWRAPPER_LOCATION=`command -v virtualenvwrapper.sh` | |
if [ "$VIRTUALENVWRAPPER_LOCATION" == "" ]; | |
then echo "virtualenvwrapper is not installed" && exit | |
else eval ". $VIRTUALENVWRAPPER_LOCATION" | |
fi | |
# check venv folder config | |
VENV_FOLDER_CONFIG=$HOME/.venv-upgrade-config | |
if [ -f "$VENV_FOLDER_CONFIG" ]; then | |
echo "config file detected!" | |
read -p "Do you want to update venv folder? (y/n): " confirm_upgrade | |
case $confirm_upgrade in | |
y | Y) | |
read -e -p "Please input new venv folder: " new_folder | |
echo $new_folder > $VENV_FOLDER_CONFIG | |
;; | |
*) | |
echo "config file unchanged" | |
;; | |
esac | |
else | |
echo "config file not detected" | |
read -e -p "Please input your venv folder: " venv_folder | |
echo $venv_folder > $VENV_FOLDER_CONFIG | |
fi | |
echo "======================================================" | |
# check if the last character of venv folder is / or not | |
VENV_FOLDER=`cat $VENV_FOLDER_CONFIG` | |
if [ "${VENV_FOLDER: -1}" != "/" ]; | |
then | |
VENV_FOLDER=$VENV_FOLDER"/" | |
fi | |
# select venv to reinstall | |
VENV_LIST=`find $VENV_FOLDER -maxdepth 1 -type d | awk -F/ '{print $5}' | sed 1d` | |
select venv_select in $VENV_LIST | |
do | |
VENV_SELECTED=$VENV_FOLDER$venv_select | |
if [ "$venv_select" != "" ]; | |
then break | |
fi | |
done | |
echo "======================================================" | |
# get venv interpreter | |
VENV_INTERPRETER=`ls -l $VENV_SELECTED/bin/python | awk -F"->" '{print $2}' | rev | cut -d/ -f1 | rev` | |
# lib path | |
VENV_LIBPATH="$VENV_SELECTED/lib/$VENV_INTERPRETER/site-packages/" | |
# extract packages to temporary file | |
VENV_PACKAGE_FILE="/tmp/venv-requirements.txt" | |
python -m pip freeze --path $VENV_LIBPATH > $VENV_PACKAGE_FILE | |
# remove old venv | |
rmvirtualenv $venv_select | |
mkvirtualenv -p $VENV_INTERPRETER $venv_select | |
# install requirements | |
$VENV_SELECTED/bin/pip install -r $VENV_PACKAGE_FILE | |
# remove temporary file | |
rm $VENV_PACKAGE_FILE | |
echo "======================================================" | |
echo "Successfully rebuild virtualenv!" | |
echo "======================================================" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment