MacOS – The “python” CLI executable seems to ignore path hierarchy

macospythonterminal

I have the following strange situation on my (freshly installed El Capitan, otherwise empty) Mac.

I noticed that /usr/bin/python defaults to python 2.7 (still), and the new SIP security system "protects" me from replacing it with a symlink to point to python3 (which I installed in /usr/local/bin). I noticed that /usr/local/bin shows up first on the path:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

So I thought great, I'll just add a symlink in /usr/local/bin called python and point it to python3.

$ ls -al /usr/local/bin
...
lrwxr-xr-x   ... python -> /usr/local/bin/python3
lrwxr-xr-x   ... python3 -> ../Cellar/python3/3.5.0/bin/python3

And this is reflected by which

$ which python
/usr/local/bin/python

But when I actually use it, it goes back to the native python2.7

$ python --version
Python 2.7.10

What gives? Is OS X tinkering with my $PATH and not telling me? What steps can I take to ensure I know what command is actually going to be run?

Best Answer

Try closing your terminal window, and making a new one. The shell only actually checks where commands are located on launch, and doesn't check again if it thinks it knows where the command is located. It's a performance boost in scripts, so generally a good idea.