200

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

I get 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 pip.

Does it mean that in previous versions, things were different, and now pip and 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?

TylerH
  • 20,799
  • 66
  • 75
  • 101
Ammar Alyousfi
  • 4,112
  • 5
  • 31
  • 42
  • 3
    https://stackoverflow.com/questions/61664673/should-i-use-pip-or-pip3 is marked as a duplicate of this question, but is not specific to MacOS and IMHO has better answers. – tripleee Jul 03 '23 at 07:48
  • What worked on that version of MacOS also depends on how exactly you installed and configured Python 3. Back in the day, MacOS itself did not provide Python 3 at all. – tripleee Jul 03 '23 at 07:51

9 Answers9

131

Your pip is a soft link to the same executable file path with pip3. you can use the commands below to check where your pip and 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

  • set default pip to some version.
  • make different links for different versions.

It is the same situation with python, python2, python3

More information below if you're interested in how it happens in different cases:

Paulo Merson
  • 13,270
  • 8
  • 79
  • 72
CSJ
  • 2,709
  • 4
  • 24
  • 30
  • 3
    I think this is wrong. My pip3 also calls itself just pip in its help output, still, plain pip installs Python 2 packages on my system. I think https://stackoverflow.com/a/40832677/188108 is correct, at least it agrees with my observations. – Torsten Bronger Jan 02 '19 at 07:06
  • it changes on what environment and how you install python, this answer is to give clue how to know pip works, and to answer the questioner's situation. if it not same on your system, you still can use the same way to find out why. not mean it is wrong answer. – CSJ Jan 03 '19 at 09:22
  • 1
    I doubt that. I have no Mac but on the Ubuntu flavours I tested, pip variants are not symlinks. Instead, they are tiny Python scripts that differ only in the shebang line. – Torsten Bronger Jan 03 '19 at 09:52
  • yeah, that's what I mean it changes on environment and the way you install python(brew, apt, pyenv, compile manually, etc) and to the questioner's situation it is because they are soft links, and we use `ls -l` and `pip show` to verify the reason.and of course, this answer is to answer his question. – CSJ Jan 03 '19 at 10:13
  • I don’t think there were symlinks on the questioner’s computer. I don’t find any reference that pip ever worked/works this way. – Torsten Bronger Jan 03 '19 at 11:47
  • as I mentioned, it is depends on how you install it. MacOS users mostly use brew and which will create soft links: https://github.com/Homebrew/homebrew-core/blob/master/Formula/python.rb#L216 – CSJ Jan 03 '19 at 13:59
  • For more information, Fedora family, Archlinux family have the same way: https://src.fedoraproject.org/cgit/rpms/python-pip.git/tree/python-pip.spec#n415, https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/python#n118 – CSJ Jan 03 '19 at 14:18
  • For Debian family is different: https://salsa.debian.org/python-team/modules/python-pip/blob/master/debian/rules#L29 – CSJ Jan 03 '19 at 14:19
  • I just installed pip/pip3 in current ArchLinux and Fedora containers: No symlinking. RHEL doesn't do it either. I cannot test Mac, though, but this Homebrew script even links python3 to python, which is a disastrously bad idea. – Torsten Bronger Jan 04 '19 at 05:48
46

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 pip3 --version.

On your system you have now pip, pip2 and pip3.

If you want you can change pip to point to pip2 instead of pip3.

apadana
  • 13,456
  • 15
  • 82
  • 98
22

When you install python3, pip3 gets installed. And if you don't have another python installation(like python2.7) then a link is created which points pip to pip3.

So 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.

Ani Menon
  • 27,209
  • 16
  • 105
  • 126
17

By illustration:

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), pip is pip3.

Victoria Stuart
  • 4,610
  • 2
  • 44
  • 37
10

I think pip, pip2 and pip3 are not soft links to the same executable file path. Note these commands and results in my Linux terminal:

mrz@mrz-pc ~ $ ls -l `which pip`
-rwxr-xr-x 1 root root 292 Nov 10  2016 /usr/bin/pip
mrz@mrz-pc ~ $ ls -l `which pip2`
-rwxr-xr-x 1 root root 283 Nov 10  2016 /usr/bin/pip2
mrz@mrz-pc ~ $ ls -l `which pip3`
-rwxr-xr-x 1 root root 293 Nov 10  2016 /usr/bin/pip3
mrz@mrz-pc ~ $ pip -V
pip 9.0.1 from /home/mrz/.local/lib/python2.7/site-packages (python 2.7)
mrz@mrz-pc ~ $ pip2 -V
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)
mrz@mrz-pc ~ $ 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.

Mohammad Reza
  • 693
  • 9
  • 16
  • I would say it's a little misleading to say that pip is linked to whatever environment is appropriate for the context. In the case of venv the pip executable is specific to the venv and not the system. Unless you installed multiple versions of python in the same venv I can't see this problem arising there. When not using a venv, the version of pip used is sometimes unintuitive and depends on the configuration of your system (often it's determined by which version of python was installed first, as others have said) . But Pip doesn't have any intelligence it uses to select a version dynamically – Luke Baumann Jan 08 '18 at 04:08
  • This is specific to your system, not Linux generally. The OP was asking about MacOS, anyway. – tripleee Jul 03 '23 at 07:46
8

This is a tricky subject. In the end, if you invoke pip it will invoke either pip2 or pip3, depending on how you set your system up.

Max Uppenkamp
  • 974
  • 4
  • 16
  • This really should be a comment because it does not provide an _answer_ to the question(s) being posed, just says "it depends" and doesn't even go into detail about what it depends on. – TylerH Mar 21 '22 at 14:10
2

If you installed Python 2.7, I think you could use pip2 and pip2.7 to install packages specifically for Python 2, like

pip2 install some_pacakge

or

pip2.7 install some_package

And you may use pip3 or pip3.5 to install pacakges specifically for Python 3.

mikeqfu
  • 329
  • 2
  • 10
1

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.

(fastai) C:\Users\redact\Downloads\fast.ai\deeplearning1\nbs>pip --version

pip 9.0.1 from C:\ProgramData\Anaconda3\envs\fastai\lib\site-packages (python 3.6)

(fastai) C:\Users\redact\Downloads\fast.ai\deeplearning1\nbs>pip3 --version

pip 9.0.1 from c:\users\redact\appdata\local\programs\python\python36\lib\site-packages (python 3.6)

P M
  • 33
  • 3
0

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'

background:

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

Somehow 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.

JL Peyret
  • 10,917
  • 2
  • 54
  • 73
  • expectations: agree. This problem started with having Python 3 not really compatible with Python 2 – Roland Dec 01 '20 at 16:16
  • 1
    @Roland it's got extremely little to do with 2 vs 3 and a lot more with path management and pip's often obscure relationship with python and the python version. just figuring out how to install pip with python at all is a pain in the neck, at least on macOS. And so is pip's insistence to come in as an obsolete version most of the time, which needs immediate updating. – JL Peyret Dec 02 '20 at 19:38
  • Of course you are correct. But your explanation shows the complexity leading to my misunderstanding. Learning Fortran was easy, same Pascal, Lisp, C, C++, C#, JS, Python. Building linux, setting up X Windows, Apache, that's doable. But setting up python, that really beats me :-( – Roland Dec 02 '20 at 23:38