Switch between python 2.7 and python 3.5 on Mac OS X
PythonMacosPython 2.7Python 3.xTerminalPython Problem Overview
I generally use Python 2.7 but recently installed Python 3.5 using Miniconda on Mac OS X. Different libraries have been installed for these two versions of python. Now, the entering either of the keywords 'python' or 'python3' in terminal invokes python 3.5, and 'python2' returns '-bash: python2: command not found'. How can I now invoke them specifically using aliases 'python2' and 'python3' respectively?
I am currently using OS X El Capitan.
Python Solutions
Solution 1 - Python
IMHO, the best way to use two different Python versions on macOS is via homebrew
. After installing homebrew on macOS, run the commands below on your terminal.
brew install python@2
brew install python
Now you can run Python 2.7 by invoking python2
or Python 3 by invoking python3
. In addition to this, you can use virtualenv
or pyenv to manage different versions of python
environments.
I have never personally used miniconda
but from the documentation, it looks like it is similar to using pip
and virtualenv
in combination.
Solution 2 - Python
OSX's Python binary (version 2) is located at /usr/bin/python
if you use which python
it will tell you where the python
command is being resolved to. Typically, what happens is third parties redefine things in /usr/local/bin
(which takes precedence, by default over /usr/bin
). To fix, you can either run /usr/bin/python
directly to use 2.x or find the errant redefinition (probably in /usr/local/bin
or somewhere else in your PATH
)
Solution 3 - Python
I already had python3 installed(via miniconda3) and needed to install python2 alongside in that case brew install python
won't install python2, so you would need
brew install python@2
.
Now alias python2
refers to python2.x from /usr/bin/python
and alias python3
refers to python3.x from /Users/ishandutta2007/miniconda3/bin/python
and alias python
refers to python3 by default.
Now to use python
as alias for python2, I added the following to .bashrc
file
alias python='/usr/bin/python'
.
To go back to python3 as default just remove this line when required.
Solution 4 - Python
Here is how to set the Python version back to 2.7 if you have installed Anaconda3 (Python 3.6) on MacOS High Sierra 10.13.5.
- Edit the .bash_profile file in your home directory.
vi $HOME/.bash_profile
- Comment out the line with
anaconda3
addition to yourPATH
like this:# export PATH="/Users/YOURUSERNAME/anaconda3/bin:$PATH"
- Close the shell, then open it again
- You should now see 2.7 when you run
python
Then, if you want 3.6 you can simply uncomment out the anaconda3
line in your .bash_profile.
Trying to unlink python
will end in tears in Mac OS X.
You will get something like this
unlink: /usr/bin/python: Operation not permitted
Solution 5 - Python
Similar to John Wilkey's answer I would run python2 by finding which python
, something like using /usr/bin/python
and then creating an alias in .bash_profile
:
alias python2="/usr/bin/python"
I can now run python3 by calling python
and python2 by calling python2
.
Solution 6 - Python
I just follow up the answer from @John Wilkey.
My alias python
used to represent python2.7 (located in /usr/bin
).
However the default python_path is now preceded by /usr/local/bin
for python3
; hence when typing python
, I didn't get either the python version.
I tried make a link in /usr/local/bin
for python2
:
ln -s /usr/bin/python /usr/local/bin/
It works when calling python
for python2
.
Solution 7 - Python
If you want to use Apple’s system install of Python 2.7, be aware that it doesn’t quite follow the naming standards laid out in PEP 394.
In particular, it includes the optional symlinks with suffix 2.7
that you’re told not to rely on, and does not include the recommended symlinks with suffix 2
that you’re told you should rely on.
If you want to fix this, while sticking with Apple’s Python, you can create your own symlinks:
$ cd <somewhere writable and in your PATH>
$ ln -s /usr/bin/python python2
Or aliases in your bash config:
alias python2 python2.7
And you can do likewise for Apple’s 2to3, easy_install, etc. if you need them.
You shouldn’t try to put these symlinks into /usr/bin
, and definitely don’t try to rename what’s already there, or to change the distutils setup to something more PEP-compliant. Those files are all part of the OS, and can be used by other parts of the OS, and your changes can be overwritten on even a minor update from 10.13.5 to 10.13.6 or something, so leave them alone and work around them as described above.
Alternatively, you could:
- Just use
python2.7
instead ofpython2
on the command line and in your shbangs and so on. - Use virtual environments or conda environments. The global
python
,python3
,python2
, etc. don’t matter when you’re always using the activated environment’s localpython
. - Stop using Apple’s 2.7 and instead install a whole other 2.7 alongside it, as most of the other answers suggest. (I don’t know why so many of them are also suggesting that you install a second 3.6. That’s just going to add even more confusion, for no benefit.)