Skip to content

Instantly share code, notes, and snippets.

@alastori
Created November 11, 2025 20:03
Show Gist options
  • Select an option

  • Save alastori/18a38fdcab9012d04910bbbdecb789fb to your computer and use it in GitHub Desktop.

Select an option

Save alastori/18a38fdcab9012d04910bbbdecb789fb to your computer and use it in GitHub Desktop.
Minimal script to bootstrap project venvs under ~/.venvs
#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<'USAGE'
Usage: bootstrap_venv.sh /path/to/project [requirements-file]
Environment variables:
PYTHON_BIN Path to the Python executable to use (default: /opt/homebrew/bin/python3.12)
VENV_ROOT Directory where virtualenvs are stored (default: $HOME/.venvs)
VENV_NAME Name of the virtualenv directory (default: basename of the project path)
USAGE
}
if [[ ${1:-} == "-h" || ${1:-} == "--help" ]]; then
usage
exit 0
fi
if [[ $# -lt 1 ]]; then
echo "error: project path is required" >&2
usage
exit 1
fi
PROJECT_DIR="$(cd "$1" && pwd)"
REQ_FILE="${2:-$PROJECT_DIR/requirements-dev.txt}"
PYTHON_BIN="${PYTHON_BIN:-/opt/homebrew/bin/python3.12}"
VENV_ROOT="${VENV_ROOT:-$HOME/.venvs}"
VENV_NAME="${VENV_NAME:-$(basename "$PROJECT_DIR")}"
TARGET_VENV="$VENV_ROOT/$VENV_NAME"
LINK_PATH="$PROJECT_DIR/.venv"
if [[ ! -x "$PYTHON_BIN" ]]; then
echo "error: python binary '$PYTHON_BIN' not found or not executable" >&2
exit 1
fi
mkdir -p "$VENV_ROOT"
if [[ ! -d "$TARGET_VENV/bin" ]]; then
"$PYTHON_BIN" -m venv "$TARGET_VENV"
fi
source "$TARGET_VENV/bin/activate"
python -m ensurepip --upgrade >/dev/null
python -m pip install --upgrade pip setuptools wheel >/dev/null
if [[ -f "$REQ_FILE" ]]; then
python -m pip install -r "$REQ_FILE"
fi
deactivate
ln -sfn "$TARGET_VENV" "$LINK_PATH"
echo "Virtual environment ready:"
echo " target: $TARGET_VENV"
echo " link: $LINK_PATH"
if [[ -f "$REQ_FILE" ]]; then
echo "Installed dependencies from: $REQ_FILE"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment