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?
7 Answers
You can install a system-wide package:
$ sudo apt install python-is-python3
See caveats: python-is-python3 package in Ubuntu 20.04 - what is it and what does it actually do?
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 source ~/.bashrc
or source ~/.bash_aliases
.
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
Another way to circumvent the alias is to use \
before the 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
-
4actually i want to wipe-out 2.7 and replace it with 3.3. Seems like its a bad idea for now..– GiriJul 17, 2013 at 8:26
-
51+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.joeyJul 17, 2013 at 9:39
-
11
-
5A word of caution: this may break other scripts that expect Python 2.7.– kmiklasOct 29, 2018 at 18:46
-
13Using
alias python='python3'
does not appear to work when callingsudo python
. In this case, it opens the default python2.7 instead. Feb 21, 2019 at 11:00
[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 loaded at least once, are mostly for organizational purposes, but may vary by platform). Python virtual environments also work well.
Alias examples:
alias python=python3
or
alias python='/usr/bin/python3'
Scripts should still use something like #!/usr/bin/env python3
for cross-compatibility.
Using env
is nice for mixed use with virtual environments.
Note (thanks to @wjandrea): aliases are part of the bash runtime, not the user environment. Therefore, they are not available to the shebang (#!
). If you prefer the alias python=python3, then some program.py
without a shebang could be executed by invoking the aliased interpreter like this python program.py
. Aliasing may also be useful for systems with multiple version of python3 like 3.4 and 3.6 together.
-
2This seems to be out of date now: they planned to remove python2 in Xenial, but then didn't. Jun 20, 2016 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.– KevinJun 20, 2016 at 13:27
-
The "latest" page is also out of date, regarding the plans for Xenial. Jun 20, 2016 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.– KevinJun 20, 2016 at 13:51 -
3Aliases are internal to Bash, not part of the environment, so you will still need to use
python3
in a shebang, notpython
.– wjandreaSep 28, 2018 at 22:51
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.
-
26python2 and python3 are not alternatives. Do not use update-alternatives for this purpose.– jobinJun 2, 2014 at 18:37
-
1Why 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 ? Feb 19, 2016 at 14:28 -
17alternatives are different implementations for the same functionalities. python2 and python3 do not provide the same functionalities.– ElyDec 13, 2016 at 19:01
-
1You can do something like this if you manually installed (via ppa or whatever) other versions of python3.
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
Aug 20, 2018 at 14:45 -
This is what I needed to do for an 18.04.2 vm that does not come with python. Thanks Feb 20, 2019 at 12:05
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
I find it very helpful to simply remove /usr/bin/python and /usr/bin/pip. This forces all programs to rely on the "python2" and "python3" commands.
Although some optional and outdated packages depend on #!/usr/bin/python
to work, I would rather submit patches to those programs than continue to make weird and sometimes hard-to-debug mistakes.
cat > /usr/local/bin/py << 'EOF'
#!/bin/dash
python3 "$@"
EOF
(provided you have write permission to /usr/local/bin) likewise
cat > /usr/local/bin/pyi << 'EOF'
#!/bin/dash
python3 -i "$@"
EOF
then you only type py (and use py in #! lines) for your chosen python.
-
3Wouldn't it be simpler to use a symlink?
sudo ln -s /usr/bin/python3 /usr/local/bin/py
– wjandreaDec 4, 2018 at 1:31 -
2
python
should be kept as meaningpython2
. I meant my comment as a way to have an application specific Python version instead of trying to work around the system's Python.