The python program command executes Python 2. Python 3 can be executed using the python3 command. How can Python 3 be executed using the python command?

  • 23
    Just a warning: Do not attempt to change the /usr/bin/python symlink to point to python3 instead of 2.7. Many programs available in the Ubuntu repos require /usr/bin/python to be compatible to python 2.x. – soulsource Jul 17 '13 at 8:17
  • @soulsource, yeah I'm aware of that. that's why i asked is there an "upgrade" option available or not. – Giri Jul 17 '13 at 8:24
  • I think the answer by Radu Rădeanu is already quite close to the optimal solution. It only applies to one user, and is only in effect for directly running python typing the python command, not affecting programs with a #!/usr/bin/python shebang. – soulsource Jul 17 '13 at 8:44
  • 1
    Ah, now I got what you meant with upgrade... Actually the Ubuntu developers are working on that: wiki.ubuntu.com/Python/3 "It is a release goal for Ubuntu 14.04 LTS to have only Python 3 on the desktop CD images." – soulsource Jul 17 '13 at 8:45
  • @soulsource that's what I'm searching for! :) thanks! – Giri Jul 17 '13 at 9:36
up vote 252 down vote accepted

A simple safe way would be to use an alias. Place this into ~/.bashrc or ~/.bash_aliases file:

alias python=python3

After adding the above in the file, run the command below:

source ~/.bash_aliases or source ~/.bashrc

For example:

$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.3
$ alias python=python3
$ python --version
Python 3.4.3

To circumvent the alias use the command built-in command:

$ command python --version
Python 2.7.6

To disable the alias in the current shell use the unalias built-in command:

$ unalias python
$ python --version
Python 2.7.6
  • 1
    so no "upgrade" option..?? – Giri Jul 17 '13 at 8:14
  • @Giri You said that you have python3. What for an upgrade? – Radu Rădeanu Jul 17 '13 at 8:16
  • 3
    actually i want to wipe-out 2.7 and replace it with 3.3. Seems like its a bad idea for now.. – Giri Jul 17 '13 at 8:26
  • 26
    +1 there is no reason to purge 2.7 in order to be able to work with 3.3. As lots of software still depends on 2.7; just keep it lingering around. – don.joey Jul 17 '13 at 9:39
  • 4
    @begueradj An alias is totally different from a symbolic link. – Radu Rădeanu Jun 3 '14 at 7:41

[June 2016] The recommended place for information on the transition is official Ubuntu Python page.


From the Ubuntu wiki:

For both Ubuntu and Debian, we have ongoing project goals to make Python 3 the default, preferred Python version in the distros.

What this does not mean:

  • /usr/bin/python will point to Python 3. No, this is not going to happen (unless PEP 394 advocates otherwise, which is doubtful for the foreseeable future). /usr/bin/python and /usr/bin/python2 will point to Python 2.7 and /usr/bin/python3 will point to the latest supported Python 3 version.

  • Python 2 will be removed from the archive. No, this is not going to happen. We expect Python 2.7 to remain supported and available in Ubuntu for quite a long time, given that PEP 373 promises upstream bug fix maintenance support until 2020.

It is not recommended to change the symbolic link because of other package dependencies, but they "have ongoing project goals to make Python 3 the default, preferred Python version in the distros".


For CLI use, like @Radu Rădeanu, I would recommend putting an alias in the user's ~/.bashrc, .bash_aliases file (the different files, including ~/.bash_profile, are all loaded together and are simply for organizational purposes). Python virtual environments also work well.

Such as:

alias python=python3

or

alias python='/usr/bin/python3'

Scripts can then start with something like:

#!/usr/bin/env python

instead of

#!/usr/bin/python3

I would still recommend using #!/usr/bin/python3 (or #!/usr/bin/env python3) in scripts for simpler cross-compatibility.

Using env is nice for mixed use with virtual environments.

  • 1
    This seems to be out of date now: they planned to remove python2 in Xenial, but then didn't. – OrangeDog Jun 20 '16 at 11:30
  • 1
    @OrangeDog, thanks for the update. Yes, the wiki-page I cited is now flagged as out-of-date, as more progress has been made in the past two years for moving to only Python 3. The new page to follow this progression is the official Ubuntu Python page. – Kevin Jun 20 '16 at 13:27
  • The "latest" page is also out of date, regarding the plans for Xenial. – OrangeDog Jun 20 '16 at 13:42
  • I would not say it is "out of date" so much as "it has not been updated recently." It still seems to be the current location for keeping posts about this. However, in the comments here, I would appreciate any other recent sources anyone may find. Adding more sources to my answer, about why not to make the change to just python, is not really relevant until the conversion is complete. Even then, it may just become a non-issue. – Kevin Jun 20 '16 at 13:51
  • @OrangeDog it is very much possible to have a Xenial system without Python 2 - I've run Ubuntu Xenial Mate on Raspberry PI and it had desktop but no python2.7. There are still some optional packages (or ones needed for desktop experience) programs that pull Python 2 in so chances are you're having those. – Antti Haapala Apr 16 '17 at 7:52

Update: This is the wrong way, I have learned, since Python2 and Python3 are not interchangeable.

You can try the command line tool update-alternatives.

$ sudo update-alternatives --config python

If you get the error "no alternatives for python" then set up an alternative yourself with the following command:

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

Change the path /usr/bin/python3 to your desired python version accordingly.

  • 10
    python2 and python3 are not alternatives. Do not use update-alternatives for this purpose. – jobin Jun 2 '14 at 18:37
  • Why aren't they? Can one of you please explain why update-alternatives is not suitable for python? Is it because of legacy.python.org/dev/peps/pep-0394 ? – Dmitry Grigoryev Feb 19 '16 at 14:28
  • 5
    alternatives are different implementations for the same functionalities. python2 and python3 do not provide the same functionalities. – Ely Dec 13 '16 at 19:01

Ubuntu, and the rest of the Linux distros for that matter, are still largely dependent on Python 2.7 for a number of applications and commands. If you change the default reference of "python" to Python 3.x, then a number of Python functions will start throwing assertion errors.

For example, on Ubuntu, 'pip' for one would no longer run correctly unless you directly edited the file and changed the shebang to reference '#!/usr/bin/env python2.7'. On RHEL (Red Hat Enterprise Linux) flavors such as Red Hat, Fedora and CentOS, the 'Yum' command is also dependent on Python 2.7.

My point here is that you would cause a significant amount of code to start throwing assertion errors just so you could type 'python' in the terminal to reference Python 3.x.

You're much better off with using the 'python3' command in the terminal and the shebang '#!/usr/bin/env python3' in your Python 3.x files.

Do

cd ~
gedit .bash_aliases

then write either

alias python=python3

or

alias python='/usr/bin/python3'

Save the file, close the terminal and open it again.
Link

You can use update-alternatives to provide different versions of programs that may be needed at different times due to compatibility issues.

This answer Is a good example for how to set things up for simultaneously maintaining different versions of gcc/g++, for example.

just do the same with python2.7 and python 3.3

  • 2
    Beginning users may not be able to easily adapt the linked answer to a different situation. In addition to crediting the earlier answer, it would be good to lay out the steps needed for Python. – chaskes Oct 18 '13 at 14:47
  • Here is i found good step by step solution linuxconfig.org/… – woto Mar 12 '17 at 14:50
cat > /usr/local/bin/py
#!/usr/bin/dash
python3 "$@"
<CTRL-D>

(provided you have write permission to /usr/local/bin) likewise

cat > /usr/local/bin/pyi
#!/usr/bin/dash
python3 -i "$@"
<CTRL-D>

then you only type py (and use py in #! lines) for your chosen python.

You can symlink /usr/bin/python to python3 with

sudo ln -s /usr/bin/python3 /usr/bin/python

See the other answers for why you might not want to do this. Ubuntu 18.04 no longer comes with Python 2, so it shouldn't be too bad.

protected by heemayl Mar 25 '16 at 17:01

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.