Created
February 4, 2026 10:50
-
-
Save tkanhe/cfddae07094063835a8618ceb539d6e6 to your computer and use it in GitHub Desktop.
Install python 3.12 on Ubuntu 22.04 in WSL
This file contains hidden or 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
| #!/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