Whenever I am trying to install any package using pip, I am getting this import error:
guru@guru-notebook:~$ pip3 install numpy
Traceback (most recent call l
Please run the following commands to do the fix. After running python3 -m pip install --upgrade pip
, please run the following command.
hash -r pip
Source: https://github.com/pypa/pip/issues/5221
We can clear the error by modifying the pip file.
Check the location of the file:
$ which pip
path -> /usr/bin/pip
Go to that location(/usr/bin/pip) and open terminal
Enter: $ sudo nano pip
You can see:
import sys
from pip import main
if __name__ == '__main__':
sys.exit(main())
Change to:
import sys
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())
then ctrl + o write the changes and exit
Hope this will do!!
Use python -m pip install
instead of pip install
Example:
python -m pip install --user somepackage
python3 -m pip install --user somepackage
The pip
(resp. pip3
) executable is provided by your distro (python-pip
package on Ubuntu 16.04) and located at /usr/bin/pip
.
Therefore, it is not kept up-to date with the pip
package itself as you upgrade pip, and may break.
If you just use python -m pip
directly, e.g. as in:
python -m pip install --user somepackage
python3 -m pip install --user somepackage
it goes through your Python path, finds the latest version of pip and executes that file.
It relies on the fact that file is executable through import
, but that is a very standard type of interface, and therefore less likely to break than the hackier Debian script.
Then I recommend adding the following aliases to your .bashrc
:
pip() ( python -m pip "$@" )
pip3() ( python3 -m pip "$@" )
The Ubuntu 18.04 /usr/bin/pip3
file does:
from pip import main
and presumably main
was removed from pip
at some point which is what broke things.
The breaking pip commit appears to be: 95bcf8c5f6394298035a7332c441868f3b0169f4 "Move all internal APIs to pip._internal" which went into pip 18.0.
Tested in Ubuntu 16.04 after an update from pip3
9.0.1 to 18.0.
pyenv
Ultimately however, for serious Python development I would just recommend that you install your own local Python with pyenv + virtualenv, which would also get around this Ubuntu bug: https://askubuntu.com/questions/682869/how-do-i-install-a-different-python-version-using-apt-get/1195153#1195153
In ubuntu 18.04.1 Bionic Beaver, you need to log out and log back in (restart not necessary) to get the proper environment.
$ sudo apt install python-pip
$ pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)
$ pip install --upgrade pip
$ pip --version
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
from pip import main
ImportError: cannot import name main
$ exit
<login>
$ pip --version
pip 18.1 from /home/test/.local/lib/python2.7/site-packages/pip (python 2.7)
As @cryptoboy said - check what pip/python version you have installed
demon@UbuntuHP:~$ pip -V
demon@UbuntuHP:~$ pip2 -V
demon@UbuntuHP:~$ pip3 -V
and then check for no-needed libraries in your .local/lib/ folder.
I did backup of settings when I was migrating to newer Kubuntu and in had .local/lib/python2.7/ folder in my home directory. Installed python 3.6. I just removed the old folder and now everything works great!
Thanks to Anthony's explanation above, you can retain your original system pip (in /usr/bin/ and dist-packages/) and remove the manually-installed pip (in ~/.local/) to resolve the conflict:
$ python3 -m pip uninstall pip
Ubuntu/Debian pip v8.1.1 (16.04) from python3-pip
debian package (see$ pip3 -V
) shows the same search results as the latest pip v10.0.1, and installs latest modules from PyPI just fine. It has a working pip
command (already in the $PATH), plus the nice --user
option patched-in by default since 2016. Looking at pip release notes, the newer versions are mostly about use-case specific bug fixes and certain new features, so not everyone has to rush upgrading pip just yet. And the new pip 10 can be deployed to Python virtualenvs, anyway.
But regardless of pips, your OS allows to quickly install common Python modules (including numpy) with APT, without the need for pip, for example:
$ sudo apt install python3-numpy python3-scipy
(with system dependencies)
$ sudo apt install python3-pip
(Debian-patched pip, slightly older but it doesn't matter)
Quick apt syntax reminder (please see
man apt
for details):
$ sudo apt update
(to resync Ubuntu package index files from up-to-date sources)
$ apt search <python-package-name>
(full text-search on all available packages)
$ apt show <python-package-name>
(displays the detailed package description)
$ sudo apt install <python-package-name>
Package names prefixed with python-
are for Python 2; and prefixed with python3-
are for Python 3 (e.g. python3-pandas). There are thousands, and they undergo integration testing within Debian and Ubuntu. Unless you seek to install at per-user level (pip install --user
option) or within virtualenv/venv, apt could be what you needed. These system packages are accessible from virtual envs too, as virtualenv will gracefully fall back to using system libs on import if your envs don't have given copies of modules.
Your custom-installed (with pip --user
) per-user modules in ~/.local/lib
will override them too.
Note, since this is a system-wide installation, you'd rarely need to remove them (need to be mindful about OS dependencies). This is convenient for packages with many system dependencies (such as with scipy or matplotlib), as APT will keep track and provide all required system libs and C extensions, while with pip you have no such guarantees.
In fact, for system-wide Python packages (in contrast to per-user, home dir level, or lower), Ubuntu expects using the APT package manager (rather than sudo pip
) to avoid breaking OS: sudo pip3
targets the very same /usr/lib/python3/dist-packages
directory where APT stores OS-sensitive modules. Recent Debian/Ubuntu releases depend heavily on Python 3, so its pre-installed modules are managed by apt
and shouldn't be changed.
So if you use pip3 install
command, please ensure that it runs in an isolated virtual dev environment, such as with virtualenv (sudo apt install python3-virtualenv
), or with Python3 built-in (-m venv
), or at a per-user level (--user
pip option, default in Ubuntu-provided pip since 2016), but not system-wide (never sudo pip3
!), because pip interferes with the operation of the APT package manager and may affect Ubuntu OS components when a system-used python module is unexpectedly changed. Good luck!
P. S. All the above is for the 'ideal' solution (Debian/Ubuntu way).
If you still want to use the new pip3 v10 exclusively, there are 3 quick workarounds:
bash
) - and pip3 v10 becomes available (see pip3 -V
). debian's pip3 v8 remains installed but is broken; or$ hash -d pip3 && pip3 -V
to refresh pip3 pathname in the $PATH. debian's pip3 v8 remains installed but is broken; or$ sudo apt remove python3-pip && hash -d pip3
to uninstall debian's pip3 v8 completely, in favor of your new pip3 v10.Note: You will always need to add --user
flag to any non-debian-provided pip, unless you are in a virtualenv! (it deploys python packages to ~/.local/
, default in debian/ubuntu-provided python3-pip and python-pip since 2016). Your use of pip 10 system-wide, outside of virtualenv, is not really supported by Ubuntu/Debian. Never sudo pip3
!
Further details:
https://github.com/pypa/pip/issues/5221#issuecomment-382069604
https://github.com/pypa/pip/issues/5240#issuecomment-381673100