Skip to content

Instantly share code, notes, and snippets.

@yasithdev
Last active June 26, 2021 04:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yasithdev/ad51b1a3eec2ce7a7d991a267b490a5f to your computer and use it in GitHub Desktop.
Save yasithdev/ad51b1a3eec2ce7a7d991a267b490a5f to your computer and use it in GitHub Desktop.
venv | helper
venv() {
USAGE_INFO="Usage: venv [ -h | create [ ENV_NAME [ --overwrite ] ] | delete | activate | list | update ]"
DIR_ALREADY_EXISTS="A virtual environment / directory already exists with that name. Use --overwrite flag to overwrite it."
NOT_IN_VENV="This command is only allowed in a virtual environment."
VENV_DIR_NOT_SET="VENV_DIR environment variable is not set."
VENV_PYVER_NOT_SET="VENV_PYVER environment variable is not set."
VENV_CREATED="Virtual environment created"
VENV_DELETED="Virtual environment deleted"
VENV_ACTIVATED="Virtual environment activated"
VENV_LIST="Available virtual environments: "
ARG_HELP="-h"
ARG_CREATE="create"
ARG_DELETE="delete"
ARG_ACTIVATE="activate"
ARG_LIST="list"
ARG_UPDATE="update"
ARG_OVERWRITE="--overwrite"
IN_VENV=$(type deactivate 2>/dev/null | head -n 1 | grep -c function)
# sanity checks
if [ -z "$1" ] || [ "$1" = "$ARG_HELP" ]; then echo "$USAGE_INFO" && echo && return; fi
if [ -z "$VENV_DIR" ] || [ -z "$VENV_PYVER" ]; then
([ -z "$VENV_DIR" ] && echo "$VENV_DIR_NOT_SET")
([ -z "$VENV_PYVER" ] && echo "$VENV_PYVER_NOT_SET")
echo
return
fi
# logic
if [ "$1" = "$ARG_CREATE" ] && [ ! -z "$2" ]; then
[ "$3" = "$ARG_OVERWRITE" ] && rm -rf $VENV_DIR/$2
([ -d "$VENV_DIR/$2" ] && echo $DIR_ALREADY_EXISTS) || (python$VENV_PYVER -m venv $VENV_DIR/$2 && echo "$VENV_CREATED - $2")
elif [ "$1" = "$ARG_DELETE" ] && [ ! -z "$2" ]; then
[ "$IN_VENV" -eq 1 ] && deactivate
rm -rf $VENV_DIR/$2 && echo "$VENV_DELETED - $2"
elif [ "$1" = "$ARG_ACTIVATE" ] && [ ! -z "$2" ]; then
source $VENV_DIR/$2/bin/activate && echo "$VENV_ACTIVATED - $2"
elif [ "$1" = "$ARG_LIST" ]; then
echo "$VENV_LIST" && (ls -1 $VENV_DIR | xargs -I {} sh -c 'printf "\t* {} ($($VENV_DIR/{}/bin/python -V | cut -d " " -f 2))\n"')
elif [ "$1" = "$ARG_UPDATE" ]; then
[ "$IN_VENV" -eq 1 ] && (pip list --format=freeze | cut -d "=" -f 1 | xargs -I {} pip install --upgrade {}) || echo "$NOT_IN_VENV"
else
echo "$USAGE_INFO"
fi
echo
}
@yasithdev
Copy link
Author

yasithdev commented Apr 17, 2020

Instructions

  • Add this function to your .bashrc, .zshrc, or .profile. You can also download this file, and source it in one of them (source <filename>)
  • Set $VENV_DIR to an existing directory where you want to create your virtual environments in.
  • Set $VENV_PYVER to the python version you plan to use. E.g., if you set VENV_PYVER=XXX, then it runs pythonXXX.

Compatibility

  • MacOS 10.15 - OK
  • Ubuntu 18.04 - OK

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment