113

What I'm trying to do here is to make python3 as my default python. Except the python 2.7 which automatically installed on mac, I installed python3 with homebrew. This is the website that I'm following. http://docs.python-guide.org/en/latest/starting/install3/osx/#install3-osx

I guess I followed every instruction well, got xcode freshly installed, Command line tools, and homebrew. But here's my little confusion occurs.

The script will explain what changes it will make and prompt you before the installation begins. Once you’ve installed Homebrew, insert the Homebrew directory at the top of your PATH environment variable. You can do this by adding the following line at the bottom of your ~/.profile file

export PATH=/usr/local/bin:/usr/local/sbin:$PATH

I was really confused what this was, but I concluded that I should just add this following line at the bottom of ~/.profile file. So I opened the ~/.profile file by open .profile in the terminal, and added following line at the bottom. And now it looks like this.

export PATH=/usr/local/bin:/usr/local/sbin:$PATH
# Setting PATH for Python 3.6
# The original version is saved in .profile.pysave
export PATH=/usr/local/bin:/usr/local/sbin:$PATH

And then I did brew install python, and was hoping to see python3 when I do python --version. But it just shows me python 2.7.10. I want my default python to be python3 not 2.7

And I found a little clue from the website.

Do I have a Python 3 installed?

$ python --version
Python 3.6.4

If you still see 2.7 ensure in PATH /usr/local/bin/ takes pecedence over /usr/bin/

Maybe it has to do something with PATH? Could someone explain in simple English what PATH exactly is and how I could make my default python to be python3 when I run python --version in the terminal?

Community
  • 1
  • 1
Sambo Kim
  • 1,383
  • 2
  • 11
  • 12
  • 4
    What's wrong with just running `python3` (and `pip3`, etc.)? That's still [the recommended solution for *nix systems at least until 2020](https://www.python.org/dev/peps/pep-0394/). (If the extra character is too much for you, just alias `py` or `py3` to `python3`, and it's even shorter than `python`.) Or, alternatively, have you considered using `venv`/`virtualenv`? – abarnert Apr 07 '18 at 06:04
  • 1
    Meanwhile, if you want to understand what `PATH` is, you should not search Python-related sources for that, but general Unix resources. [SuperUser](https://superuser.com/) or [AskDifferent](https://apple.stackexchange.com/) might be more relevant than StackOverflow, but really, you're asking someone to write a tutorial, there are already plenty of better tutorials online. – abarnert Apr 07 '18 at 06:06
  • 1
    There are two different use cases here: yours and your system's. Let macos use the installed 2.7 version, otherwise you will have dependency issues. I would highly recommend installing second, dedicated distribution (such as Anaconda/conda, like virtualenv suggested above) if you want to program in python. – anon01 Apr 07 '18 at 07:15
  • Adding things to the `PATH` twice just make things (a very little bit) slower. `export`ing `PATH` which is almost certainly already exported on your behalf by the system is also not useful. – tripleee Apr 07 '18 at 07:28
  • I'm a beginner here in python so I just thought it should print python3. That's because what the website says so. If there's no problem with just typing `python3`, I will do that. Thanks for the explanation guys.Cheers :) – Sambo Kim Apr 07 '18 at 10:07
  • Personally, I've stopped using Brew python, and use pyenv https://github.com/pyenv/pyenv – OneCricketeer Apr 07 '18 at 20:19
  • Possible duplicate of [How to set Python's default version to 3.x on OS X?](https://stackoverflow.com/q/18425379/608639) – jww Sep 24 '18 at 23:07
  • why don't i have a .profile file? – Steve Boniface Feb 09 '19 at 15:31

5 Answers5

203

Probably the safest and easy way is to use brew and then just modify your PATH:

First update brew:

brew update

Next install python:

brew install python

That will install and symlink python3 to python, for more details do:

brew info python

Look for the Caveats:

==> Caveats
Python has been installed as
  /usr/local/bin/python3

Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
  /usr/local/opt/python/libexec/bin

Then add to your path /usr/local/opt/python/libexec/bin:

export PATH=/usr/local/opt/python/libexec/bin:$PATH

The order of the PATH is important, by putting first the /usr/local/opt/python/libexec/bin will help to give preference to the brew install (python3) than the one is in your system located in /usr/bin/python

nbari
  • 25,603
  • 10
  • 76
  • 131
  • I'm pretty sure Homebrew automatically updates the PATH. There's no reason to explicitly hardcode python libexec folder in there – OneCricketeer Apr 07 '18 at 20:23
  • 13
    I thought they stopped doing this last year: https://github.com/Homebrew/homebrew-core/pull/14408 – avigil Apr 07 '18 at 20:33
  • 1
    Doing this and then updating pip (with pip3 install -U pip) [causes subsequent runs of pip to error](https://stackoverflow.com/q/55871398/656912) with *pkg_resources.VersionConflict: (pip 19.1 (/usr/local/lib/python3.7/site-packages), Requirement.parse('pip==19.0.3'))*. – orome Apr 26 '19 at 16:12
  • This is mostly what I wanted, even from another Q&A https://superuser.com/questions/324616/how-should-i-set-the-path-variable-on-my-mac-so-the-hombrew-installed-tools-are, not wanting an alias or system default change, but Homebrew to manage it, possibly with an option. This is close but still requires customization of the alias. I'm also curious what further testing with pip reveals. – Pysis Jul 01 '19 at 15:51
  • This solved the problem only for once. Then, once I closed the terminal are tried again, it reverted again to the old version. – philippos May 12 '20 at 10:16
  • 1
    @philippos For mac add the path to `/etc/paths` to make it permanent https://stackoverflow.com/questions/22465332/setting-path-environment-variable-in-osx-permanently and this for Linux https://www.cyberciti.biz/faq/how-to-add-to-bash-path-permanently-on-linux/ – Abdurahman Aug 05 '20 at 06:41
  • Just a note that on Catalina, adding the path to `/etc/paths` did not cause `python` to resolve to python 3 for new terminal windows. Still looking for a solution... – Teghan Nightengale Oct 15 '20 at 12:47
  • 3
    This answer still works for the the latest Homebrew formula that lists `/usr/local/opt/python@3.9/libexec/bin` in Caveats, since `/usr/local/opt/python` provides a suitable symlink. – Edward Brey Feb 17 '22 at 20:25
66

Before we make the changes, the default version of python in my system was python 2.7.17.

python --version

Python 2.7.17

To make python3 as default python by replacing python2 in Ubuntu.

  1. Open Terminal
  2. cd
  3. nano ~/.bashrc
  4. alias python=python3 (Add this line on top of .bashrc file)
  5. Press ctr+o (To save the file)
  6. Press Enter
  7. Press ctr+x (To exit the file)
  8. source ~/.bashrc OR . ~/.bashrc (To refresh the bashrc file)

python --version

Python 3.7.5

Krunal Rajkotiya
  • 1,070
  • 9
  • 14
  • 3
    Answer is straight to the point. It worked on macOS catalina 10.15.3 – Collins USHI Jul 26 '20 at 07:37
  • 3
    Although the version is changed to python3, but the default python is still python 2.7. Like when you open a new jupyter notebook, or install a new package, the active python is still 2.7. – nightrain Aug 26 '20 at 15:35
  • 1
    Very helpful answer in case ~/.bashrc not found. check for ~/.bash_profile or ~/.zshenv. – Pravanjan Sep 17 '20 at 14:04
  • 2
    As @nightrain points out this will only work some of the time. You're not actually picking a new version of python system wide, this only alters the usage of python when invoked directly from the command line (and not from other programs which will not use your bash aliases) – kingsfoil Mar 24 '23 at 06:57
25

Changing the default python version system wide can break some applications that depend on python2. The alternative solution would be to create an alias.

If you are using zsh (the default on Mac OS) run the following from terminal:

echo 'alias python="python3"' >> ~/.zshrc
echo 'alias pip="pip3"' >> ~/.zshrc
Lord Elrond
  • 13,430
  • 7
  • 40
  • 80
5

According to this S.O. post, changing the default Python interpreter could possibly break some applications that depend on Python 2.

The post also refers to using aliasing as a solution, and this link might also be a good reference on how to do that.

Personally, I just type "Python3" before I run scripts or go into a shell environment instead of "python".

Jonathan
  • 487
  • 1
  • 9
  • 19
  • 1
    I decided that this is the best option, as you said: "python3". I just have to remember to type as well: "pip3" when installing new modules. Hehe. – Doug Barbieri Feb 11 '20 at 03:38
0

I was facing the same issue with Homebrew, but had to do an extra manual step to fix the issue, because I got too new Python 3.11 instead of wanted Python 3.10

  • I installed awscli from Homebrew which pulled in Python 3.11 installation on my Homebrew

  • I had to reinstall Python 3.10

brew install python@3.10
brew link python@3.10

However even after this python3 command pulled the wrong version of Python. So as a missing manual fix, I had to do:

ln -s /opt/homebrew/bin/python3.10 /opt/homebrew/bin/python3

Then you can check if /opt/homebrew/bin gets preference (is higher) when you check PATH configured in the .rc file of your shell:

echo $PATH | tr ":" "\n"
/opt/homebrew/bin
/Users/moo/.local/bin
/Users/moo/go/bin
/Users/moo/.go/bin
/Users/moo/.nvm/versions/node/v16.15.0/bin
/Users/moo/.zsh/bin
...
Mikko Ohtamaa
  • 82,057
  • 50
  • 264
  • 435