Skip to content

Instantly share code, notes, and snippets.

@tkanhe
Created February 4, 2026 10:50
Show Gist options
  • Select an option

  • Save tkanhe/cfddae07094063835a8618ceb539d6e6 to your computer and use it in GitHub Desktop.

Select an option

Save tkanhe/cfddae07094063835a8618ceb539d6e6 to your computer and use it in GitHub Desktop.
Install python 3.12 on Ubuntu 22.04 in WSL
#!/usr/bin/env bash
set -e # stop on any error
echo "===================================================="
echo " Installing Python 3.12 on WSL Ubuntu (SAFE METHOD)"
echo " System Python (3.10) will NOT be modified"
echo "===================================================="
# --------------------------------------------------
# STEP 1: System prep + add deadsnakes PPA
# --------------------------------------------------
echo "-> Updating system and adding deadsnakes PPA..."
sudo apt update
sudo apt install -y software-properties-common curl
sudo add-apt-repository -y ppa:deadsnakes/ppa
sudo apt update
# --------------------------------------------------
# STEP 2: Install Python 3.12
# --------------------------------------------------
echo "-> Installing Python 3.12 packages..."
sudo apt install -y \
python3.12 \
python3.12-venv \
python3.12-dev
# --------------------------------------------------
# STEP 3: Install pip for Python 3.12 (system-wide)
# --------------------------------------------------
echo "-> Installing pip for Python 3.12 (system-wide)..."
# Optional: Install system pip for Python 3.10 (if you want both)
# sudo apt install -y python3-pip
# Download get-pip safely
TMP_PIP="/tmp/get-pip.py"
curl -sS https://bootstrap.pypa.io/get-pip.py -o "$TMP_PIP"
# Install pip for Python 3.12 system-wide
# This will create: /usr/local/bin/pip, /usr/local/bin/pip3, /usr/local/bin/pip3.12
sudo python3.12 "$TMP_PIP"
# Cleanup
rm -f "$TMP_PIP"
# Verify pip3.12 was installed
if [ ! -f /usr/local/bin/pip3.12 ]; then
echo "ERROR: pip3.12 installation failed!"
exit 1
fi
# --------------------------------------------------
# STEP 4: Safe user-level defaults via /usr/local/bin
# --------------------------------------------------
echo "-> Setting Python 3.12 as default (safe override)..."
# Make Python 3.12 the default python/python3
# These symlinks override system defaults at user level
sudo ln -sf /usr/bin/python3.12 /usr/local/bin/python
sudo ln -sf /usr/bin/python3.12 /usr/local/bin/python3
# NOTE: We don't need to create pip symlinks because:
# 1. `get-pip.py` already created /usr/local/bin/pip and /usr/local/bin/pip3
# 2. These already point to Python 3.12's pip (installed in step 3)
# 3. /usr/local/bin comes before /usr/bin in PATH, so these take precedence
# --------------------------------------------------
# STEP 5: Final verification
# --------------------------------------------------
echo ""
echo "================= VERIFICATION ================="
echo "Default Python (should be 3.12):"
echo " which python: $(which python)"
echo " python --version: $(python --version 2>&1)"
echo ""
echo "Default pip (should be for Python 3.12):"
echo " which pip: $(which pip)"
echo " pip --version: $(pip --version 2>&1 | head -1)"
echo ""
echo "System Python (untouched, still 3.10):"
echo " /usr/bin/python3 --version: $(/usr/bin/python3 --version 2>&1)"
echo ""
echo "Python 3.12-specific commands also available:"
echo " python3.12 --version: $(python3.12 --version 2>&1)"
echo " pip3.12 --version: $(pip3.12 --version 2>&1 | head -1)"
echo "================================================"
echo ""
echo "DONE! Python 3.12 is now your default (safely)."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment