I have a Macbook with OS X El Captain. I think that Python 2.7 comes preinstalled on it. However, I installed Python 3.5 too. When I started using Python 3, I read that if I want to install a package, I should type:
pip3 install some_package
Anyway, now when I use
pip install some_package
some_package installed for Python 3. I mean I can import it and use it without problems. Moreover, when I type just
pip3 in the Terminal. I got this message about the usage:
Usage: pip <command> [options]
which is the same message I get when I type just
Does it mean that in previous versions, things were different, and now
pip3 can be used interchangeably? If so, and for the sake of argument, how can I install packages for Python 2 instead of Python 3?
This is a tricky subject. In the end, if you invoke
pip it will invoke either
pip3, depending on how you set your system up.
If you installed Python 2.7, I think you could use
pip2.7 to install packages specifically for Python 2, like
pip2 install some_pacakge
pip2.7 install some_package
And you may use
pip3.5 to install pacakges specifically for Python 3.
When you install
pip3 gets installed. And if you don’t have another python installation(like python2.7) then a link is created which points
pip is a link to to
pip3 if there is no other version of python installed(other than python3).
pip generally points to the first installation.
pip is a soft link to the same executable file path with
you can use the commands below to check where your
pip3 real paths are:
$ ls -l `which pip` $ ls -l `which pip3`
You may also use the commands below to know more details:
$ pip show pip $ pip3 show pip
When we install different versions of python, we may create such soft links to
It is the same situation with
More information below if you’re interested in how it happens in different cases:
If you had python 2.x and then installed python3, your pip will be pointing to pip3.
you can verify that by typing
pip --version which would be the same as
On your system you have now pip, pip2 and pip3.
If you want you can change pip to point to pip2 instead of pip3.
pip3 are not soft links to the same executable file path. Note these commands and results in my Linux terminal:
[email protected] ~ $ ls -l `which pip` -rwxr-xr-x 1 root root 292 Nov 10 2016 /usr/bin/pip [email protected] ~ $ ls -l `which pip2` -rwxr-xr-x 1 root root 283 Nov 10 2016 /usr/bin/pip2 [email protected] ~ $ ls -l `which pip3` -rwxr-xr-x 1 root root 293 Nov 10 2016 /usr/bin/pip3 [email protected] ~ $ pip -V pip 9.0.1 from /home/mrz/.local/lib/python2.7/site-packages (python 2.7) [email protected] ~ $ pip2 -V pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7) [email protected] ~ $ pip3 -V pip 9.0.1 from /home/mrz/.local/lib/python3.5/site-packages (python 3.5)
As you see they exist in different paths.
pip3 always operates on the Python3 environment only, as pip2 does with Python2. pip operates in whichever environment is appropriate to the context. For example, if you are in a Python3 venv, pip will operate on the Python3 environment.
On my Windows instance – and I do not fully understand my environment – using pip3 to install the kaggle-cli package worked – whereas pip did not. I was working in a conda environment and the environments appear to be different.
pip 9.0.1 from C:ProgramDataAnaconda3envsfastailibsite-packages (python 3.6)
pip 9.0.1 from c:usersredactappdatalocalprogramspythonpython36libsite-packages
pip --version pip 19.0.3 from /usr/lib/python3.7/site-packages/pip (python 3.7) pip3 --version pip 19.0.3 from /usr/lib/python3.7/site-packages/pip (python 3.7) python --version Python 3.7.3 which python /usr/bin/python ls -l '/usr/bin/python' lrwxrwxrwx 1 root root 7 Mar 26 14:43 /usr/bin/python -> python3 which python3 /usr/bin/python3 ls -l /usr/bin/python3 lrwxrwxrwx 1 root root 9 Mar 26 14:43 /usr/bin/python3 -> python3.7 ls -l /usr/bin/python3.7 -rwxr-xr-x 2 root root 14120 Mar 26 14:43 /usr/bin/python3.7
Thus, my in my default system python (Python 3.7.3),
Given an activated Python 3.6 virtualenv in somepath/venv, the following aliases resolved the various issues on a macOS Sierra where pip insisted on pointing to Apple’s 2.7 Python.
alias pip='python somepath/venv/lib/python3.6/site-packages/pip/__main__.py'
This didn’t work so well when I had to do
sudo pip as the root user doesn’t know anything about my alias or the virtualenv, so I had to add an extra alias to handle this as well. It’s a hack, but it works, and I know what it does:
alias sudopip='sudo somepath/venv/bin/python somepath/venv/lib/python3.6/site-packages/pip/__main__.py'
pip3 did not exist to start (command not found) with and
which pip would return /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/pip, the Apple Python.
Python 3.6 was installed via macports.
After activation of the 3.6 virtualenv I wanted to work with,
which python would return somepath/venv/bin/python
pip install would do the right thing and hit my virtualenv, but
pip list would rattle off Python 2.7 packages.
For Python, this is batting way beneath my expectations in terms of beginner-friendliness.
In my system, I use the update alternatives.
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip2 2
If I want to switch between them I use the following command.
sudo update-alternatives --config pip
Note: The 1st line is enough if you have only pip3 installed and not pip2.