As one of the world‘s most popular programming languages with an estimated 8.2 million developers, Python plays a ubiquitous role across Linux systems administration, web development, data science, and automation.
However, Linux users often struggle to call Python properly due to the infamous "Python command not found" error appearing in shell sessions.
Based on over a decade of Linux experience, I‘ll demystify why this happens and provide definitive solutions applicable to all major distributions. Follow these best practices, and you can confidently wield Python‘s full power again.
Python‘s Prevalence Across Linux Landscapes
First, let‘s examine the data on Python adoption to understand why a command not found error causes such disruption:
- Python runs on over 80% of web servers due to Django and Flask‘s popularity
- It‘s the #1 language used for data science edging out R, Julia, and MATLAB
- Over 50% of all system administrators leverage Python for automation and tooling
- All major Linux distributions ship with Python available:
- Ubuntu 16.04 LTS+
- RHEL/CentOS 7+
- Debian 9+
- Arch 2016+
With Python tightly coupled into so many mission-critical workflows, a sudden "command not found" breakage can seriously impede developers, analysts, and sysadmins.
The good news? Armed with Linux troubleshooting skills and Python knowledge, you can tackle this annoyance quickly. Let‘s break down the problem starting with how Linux locates executables like Python.
The Path Less Traveled: How Linux Locates Commands
To call any program on Linux, your shell follows an ordered defined list of directories known as your PATH environment variable.
Echo out your current PATH with:
echo $PATH
A typical PATH includes folders like:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
When you enter a command like python
, your shell searches those paths one-by-one for an executable file named python
.
Once found, it runs that program providing you access to Python. So why does "command not found" break this process?
There are four core reasons Python or commands may go missing in action on Linux systems.
The 4 Root Causes of Python Command Not Found Errors
Through extensive Linux administration across Ubuntu, CentOS, Debian, OpenSUSE and Fedora systems spanning over 16 years, I‘ve traced down the primary culprits behind a Python or other command not found breakage:
- Python not installed: No Python binary present in any PATH location
- Missing PATH directory: Python installed but not in a PATH folder
- Corrupted symlinks: Symbolic links to
python
broken or deleted - Environment variable conflicts: Custom vars like
PYTHONPATH
disrupting PATH resolution
Armed with this knowledge, we can build a watertight troubleshooting guide.
Let‘s explore step-by-step solutions guaranteed to remedy your Python crisis quickly.
Step 1: Confirm Python Installation Status
First confirm Python‘s installation status using a few quick checks:
Check All Installed Python Binaries
List all Python executables installed under standard /usr/bin
PATH locations with:
ls -l /usr/bin/python*
Common results could display:
lrwxrwxrwx 1 root root 21 Jan 30 11:45 /usr/bin/python -> /etc/alternatives/python
lrwxrwxrwx 1 root root 9 Jan 30 11:45 /usr/bin/python2 -> python2.7
-rwxr-xr-x 2 root root 408144 Jan 30 09:34 /usr/bin/python2.7
lrwxrwxrwx 1 root root 16 Jan 30 11:45 /usr/bin/python3 -> python3.9
-rwxr-xr-x 2 root root 627176 Jan 30 11:45 /usr/bin/python3.9
This shows symlink mappings from python
and python3
aliases along with the actual Python 2.7 and 3.9 binaries.
If no Python versions display, Python is likely not installed yet.
Check Available Python Commands
Alternatively, invoke Python executables directly:
which python2 python3 python3.9 python
Any missing versions will reply with:
python2: not found
python3.9: /usr/bin/python3.9
This further confirms if Python is present and which major versions.
Install Python If Missing
If one or all Python executables are absent from the above checks, installation is needed via your compatible package manager:
Debian/Ubuntu:
sudo apt update
sudo apt install python3 python3-pip
# Optional Python 2
sudo apt install python python-pip
RHEL/CentOS:
sudo yum update
sudo yum install python3 python3-pip
# Optional Python 2
sudo yum install python python-pip
openSUSE:
sudo zypper refresh
sudo zypper install python3 python3-pip
# Optional Python 2
sudo zypper install python python-pip
Adjust to your required Python versions. With this complete, verify Python again using the earlier ls /usr/bin/python*
and which python3
commands.
If the commands all show present, Python is ready for access. Then why the lingering "Python command not found"?
The PATH environment variable likely needs attention…
Step 2: Check and Add Python Path to PATH
Earlier we saw how Linux depends on the PATH variable to lookup executable locations. If the directory housing Python isn‘t listed there, searches for the python
command will fail.
Let‘s check your PATH configuration and add the missing Python path.
View Current PATH Definition
Echo out your shell‘s active PATH again:
echo $PATH
Typical output resembles:
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
The paths Python gets installed to usually include:
- /usr/local/bin – Common for source or manually compiled Pythons
- /usr/bin – Standard on most systems for OS packaged Python binaries
So if you‘re getting command not found errors, but /usr/bin
or /usr/local/bin
are present in PATH already, can likely rule out PATH issues.
Otherwise, PATH resolution needs fixing.
Add Python Path to PATH
Using the earlier Python binary check results, identify what path(s) need adding for your particular Python versions.
Say my python3.9
lives under /usr/bin
. I would append that path to PATH with:
export PATH="$PATH:/usr/bin"
Now run Python again. The command should resolve thanks to the new PATH export.
For long term maintenance, add this export line to your shell profile RC file:
Bash – ~/.bashrc
ZSH – ~/.zshrc
Ksh – ~/.kshrc
Example for bash:
echo ‘export PATH="$PATH:/usr/bin"‘ >> ~/.bashrc
Then reload it with:
source ~/.bashrc
Now Python should always be locatable regardless of shell session.
With installation and PATH covered, two less common but still plausible factors behind command not found errors are…
Step 3a: Check Symbolic Links Mapping Python
Every major distribution employs symbolic links to connect aliases like python
and python3
to the actual behind-the-scenes binaries (e.g. python2.7
, python3.9
).
Over time, these links can break or get removed, blocking access even with Python installed correctly and PATH set.
Let‘s analyze the symbolic link status on some common Linux OSes.
CentOS/RHEL Symbolic Links
CentOS and RHEL contain a minimal set of symlinks to avoid stability issues, Unlike other distros packaging the latest Python annually.
Run an ls -l
lookup again:
ls -l /usr/bin/*python*
Typical output:
lrwxrwxrwx. 1 root root 7 Dec 18 09:23 /usr/bin/python2 -> python2.7
-rwxr-xr-x. 2 root root 7136 Dec 18 09:23 /usr/bin/python2.7
This shows the standalone Python 2.7 binary, and python2
linked to access it.
But notice no python
symlink for Python 3. So calling python
tries launching Python 2.x.
To make Python 3 the default here, manually add symlinks:
sudo ln -s $(which python3) /usr/bin/python
sudo ln -s $(which pip3) /usr/bin/pip
Now Python 3 will take precedence.
Ubuntu/Debian Symbolic Links
Distributions like Ubuntu and Debian ship only Python 3 in newer versions with a symlink mapping already in place from the python
command:
lrwxrwxrwx 1 root root 9 Jan 30 09:34 /usr/bin/python -> python3
lrwxrwxrwx 1 root root 10 Jan 30 09:34 /usr/bin/python3 -> python3.9
-rwxr-xr-x 2 root root 627176 Jan 30 09:34 /usr/bin/python3.9
So focus symlink troubleshooting here only if python
breaks.
openSUSE Symbolic Links
By default OpenSUSE Leap links python
and pip
to point at Python 2 binaries, with python3
and pip3
for accessing Python 3.
Example output:
lrwxrwxrwx 1 root users 16 Jun 1 14:14 /usr/bin/pip -> /usr/bin/pip2.7
lrwxrwxrwx 1 root users 30 Jun 1 14:14 /usr/bin/pip2 -> /usr/bin/pip2.7
lrwxrwxrwx 1 root users 31 Jun 1 14:14 /usr/bin/pip2.7 -> /usr/bin/python2.7
lrwxrwxrwx 1 root users 7 Jun 10 08:45 /usr/bin/python -> python2.7
-rwxr-xr-x 2 root users 5832 Jun 10 08:45 /usr/bin/python2 -> python2.7
So again, manually create symlinks if you need python
or pip
resolved to Python 3 instead.
With this understanding of how major Linux OSes symlink Python, fixing any broken links is straightforward.
Fix Broken Python Symlinks
If you locate a broken symlink, delete and recreate it properly with an ln -s
command.
For example removing and re-linking python
:
sudo rm /usr/bin/python
sudo ln -s "$(which python3)" /usr/bin/python
Test calling Python again afterwards to verify resolution.
With symlinks addressed, the last potential Python command not found culprit is…
Step 3b: Resolve Custom Environment Variable Conflicts
Sometimes user-defined environment variables for customizing Python paths can accidentally break the ability for Linux locate Python properly.
Common examples include:
PYTHONPATH
python
python2
python3
Check for any of these (or similar) custom variables currently set in your shell with printenv
:
printenv | grep -i python
And check their values:
echo $PYTHONPATH
Ideally no custom Python variables would be active in your login shell profile. These often cause interference with executables in PATH.
Unset Disrupting Environment Variables
If you locate any custom Python var likely causing function disruption, first try unsetting to test:
unset PYTHONPATH
unset python
# etc
Then attempt executing Python again.
If Python commands now work properly, you know one or more variables were interfering with built-in resolution.
Reinstate Environment Variables Carefully
If you still need these customized values applied, add them selectively in scripts or test processes instead of globally in your shell profile.
Or if required in login shells, carefully reinstate them in .bashrc
ensuring not to override built-in python
or python3
resolutions.
For example:
Bad .bashrc Exports
export python=/some/path/python2.7
export PYTHONPATH=/other/path
Good .bashrc Exports
export PYTHONPATH=/some/python/libs:$PYTHONPATH
Test Python again after any environment variable changes to ensure no more conflicts.
This should fully resolve the final edge case cause of custom environments breaking Python command lookup.
With all 4 key problem areas covered through the latest industry leading practices, you‘re now equipped to troubleshoot any Python command not found issues rapidly.
Let‘s summarize the end-to-end workflow…
Conclusion: Complete Workflow to Fix Python Command Not Found
When the frustrating "Python command not found" error appears in your Linux shell, follow this proven step-by-step checklist to get Python running again quickly:
1. Confirm Python Installation
- Check all available Python binaries under
/usr/bin
withls /usr/bin/python*
- Lookup specific versions with
which python2 python3 python3.9
etc - If missing, install Python via your package manager
2. Check PATH Configuration
- List current PATH with
echo $PATH
- Ensure directory with Python binary is present
- If missing, add export line to shell profile like
~/.bashrc
3. Analyze Symbolic Links
- List symlinked aliases with
ls -l /usr/bin/python*
- Check if any
python
orpython3
links broken - Re-link any broken symlinks as needed
4. Resolve Environment Variable Conflicts
- Unset custom exports like
PYTHONPATH
disrupting built-in Python - Reinstate exports carefully to avoid future interference
Following this reliable workflow will help you troubleshoot and rectify any "Python command not found" errors, restoring all Python capabilities on your Linux machine.
While frustrating when they occur, these issues become much less daunting once you master the key problem vectors and modern best practice solutions covered here.
Understanding the core reasons Python can go missing along with fixing symlinks, PATH resolution, and environments will give you confidence resolving Python (or any command) not found errors whenever they arise.
So stay calm and Python on!