Skip to content

Instantly share code, notes, and snippets.

@alex65536
Last active April 18, 2021 20:58
Show Gist options
  • Select an option

  • Save alex65536/e69adc1cb814b735d2eb775e2ac61097 to your computer and use it in GitHub Desktop.

Select an option

Save alex65536/e69adc1cb814b735d2eb775e2ac61097 to your computer and use it in GitHub Desktop.
A small shell script to handle all your Python venvs
#!/bin/bash
#
# A small shell script to handle all your virtualenvs
#
# Copyright 2020-2021 Alexander Kernozhitsky <[email protected]>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
VENV_DIR=~/venvs
validate_name() {
[[ "$(grep -cEZ '^[a-zA-Z0-9-]+$' <<<"$NAME")" == 1 ]]
}
ensure_name() {
local NAME="$1"
local DIR="$VENV_DIR/$NAME"
if ! validate_name "$NAME"; then
echo "Error: Env name $NAME contains invalid chars"
exit 1
fi
if ! [[ -d "$DIR" ]]; then
echo "Error: Env $NAME does not exist"
exit 1
fi
}
init() {
if [[ "$#" != 1 ]]; then
echo "Usage: $0 init NAME"
exit 1
fi
local NAME="$1"
if ! validate_name "$NAME"; then
echo "Error: Env name $NAME contains invalid chars"
exit 1
fi
local DIR="$VENV_DIR/$NAME"
if [[ -d "$DIR" ]]; then
echo "Error: Env $NAME already exists"
exit 1
fi
python3 -m venv --upgrade-deps "$DIR"
}
start() {
if [[ "$#" != 1 ]]; then
echo "Usage: $0 start NAME"
exit 1
fi
local NAME="$1"
local DIR="$VENV_DIR/$NAME"
ensure_name "$NAME"
bash --rcfile <(echo ". $HOME/.bashrc; . $DIR/bin/activate;")
}
delete() {
if [[ "$#" != 1 ]]; then
echo "Usage: $0 delete NAME"
exit 1
fi
local NAME="$1"
local DIR="$VENV_DIR/$NAME"
ensure_name "$NAME"
while :; do
echo -n "Are you sure to delete $DIR? [y/n] "
read -r ANS
case "$ANS" in
y|Y) break ;;
n|N) exit 1 ;;
*) echo "Invalid option $ANS" ;;
esac
done
rm -rf "$DIR"
}
list() {
if [[ "$#" != 0 ]]; then
echo "Usage: $0 info"
exit 1
fi
ls -1 "$VENV_DIR"
}
info() {
if [[ "$#" != 0 ]]; then
echo "Usage: $0 info"
exit 1
fi
echo "Penv: a tiny Python venv manager"
echo "Copyright (c) 2020-2021 Alexander Kernozhitsky"
echo "Version: 0.1.1-beta"
}
py() {
if [[ "$#" != 1 ]]; then
echo "Usage: $0 py NAME"
exit 1
fi
local NAME="$1"
local DIR="$VENV_DIR/$NAME"
ensure_name "$NAME"
bash -c '
. "$0"/bin/activate
python3
' "$DIR"
}
ipython() {
if [[ "$#" != 1 ]]; then
echo "Usage: $0 ipython NAME"
exit 1
fi
local NAME="$1"
local DIR="$VENV_DIR/$NAME"
ensure_name "$NAME"
bash -c '
. "$0"/bin/activate
grep -E "^ipython\s" <<<"$(pip list)" >/dev/null || pip install ipython
ipython3
' "$DIR"
}
notebook() {
if [[ "$#" != 1 ]]; then
echo "Usage: $0 notebook NAME"
exit 1
fi
local NAME="$1"
local DIR="$VENV_DIR/$NAME"
ensure_name "$NAME"
bash -c '
. "$0"/bin/activate
grep -E "^notebook\s" <<<"$(pip list)" >/dev/null || pip install notebook
jupyter-notebook
' "$DIR"
}
unknown() {
echo "Unknown command '$CMD'"
echo "Usage: $0 init|start|delete|list|info|py|ipython|notebook"
exit 1
}
CMD="$1"
shift
case "$CMD" in
"init") init "$@" ;;
"start") start "$@" ;;
"delete") delete "$@" ;;
"list") list "$@" ;;
"info") info "$@" ;;
"py") py "$@" ;;
"ipython") ipython "$@" ;;
"notebook") notebook "$@" ;;
*) unknown "$CMD" ;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment