
When using pip to install Python packages, you might encounter the following error:
ImportError: cannot import name 'main'
This error usually occurs after you upgraded pip to the latest version. There’s a breaking change in the pip code that causes this error.
This tutorial will show you an example that causes this error and how to fix it in practice.
How to reproduce this error
Suppose you called pip from the terminal to install any package as follows:
pip3 install requests
Output:
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'
The error happens because pip changed the internal file name from main.py to __main__.py. This causes Python to not be able to import the module.
How to fix this error
To resolve this error, you need to uninstall pip completely and install it again.
You can run the following command from the terminal:
# Mac/Linux:
pip uninstall pip
pip3 uninstall pip
python -m ensurepip --upgrade
python3 -m ensurepip --upgrade
# Windows:
py -m pip uninstall pip
py -m ensurepip --upgrade
The above command should uninstall and install a fresh pip build, so the previous incompatible build is removed.
Keep in mind that this way of installing pip doesn’t include it in the PATH environment variables. Running pip install would return pip command not found error.
This means that you need to use the python -m command to invoke pip from the terminal:
# Mac/Linux:
python -m pip install requests
# Windows:
py -m pip install requests
If you want to use pip directly from the terminal, you need to add the location of the program to the PATH environment variable.
If you use Homebrew to install your Python, you can try to unlink and link the python3 package as follows:
brew unlink python3 && brew link python3
If you’re on Windows, you need to install pip again with the following command:
py -m pip install --upgrade pip
Once finished, you should be able to run the pip commands directly:
$ pip -V
pip 23.0.1
Now you can use pip to install packages again. Nice work! 🙌