Change the Python3 default version in Ubuntu

  • I am using Ubuntu 16.04 LTS . I have python3 installed. There are two versions installed, python 3.4.3 and python 3.6 . Whenever I use python3 command, it takes python 3.4.3 by default. I want to use python 3.6 with python3.

    python3 --version shows version 3.4.3

    I am installing ansible which supports version > 3.5 . So, whenever, I type ansible in the terminal, it throws error because of python 3.4

    What is the command used to execute python 3.6 ?

    command is :- python3.6

    What does your `sudo update-alternatives --config python3` say?

    update-alternatives: error: no alternatives for python3

    See my comment in the below answer on how to use ansible with a specific version of python3. You could also consider removing python 3.4.

    @Mikael Different Python versions are not alternatives on Ubuntu. The OS relies on a specific version (or versions) being installed.

  • From the comment:

    sudo update-alternatives --config python

    Will show you an error:

    update-alternatives: error: no alternatives for python3 

    You need to update your update-alternatives , then you will be able to set your default python version.

    sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 1
    sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2

    Then run :

    sudo update-alternatives --config python

    Set python3.6 as default.

    Or use the following command to set python3.6 as default:

    sudo update-alternatives  --set python /usr/bin/python3.6

    This answer will probably break `apt`. After selecting a different version of python try to run `sudo apt update`. If it gives you an error like `ModuleNotFoundError: No module named 'apt_pkg'` you want to go to `/usr/lib/python3/dist-packages` and create the symlink: `ln -s apt_pkg.cpython-{34m,36m}`.

    It gives me an error: `$ sudo update-alternatives --set python /usr/bin/python3.6 update-alternatives: error: no alternatives for python` Any suggestions?

    @GAD3R Thanks. I've managed to create a symlink manually to point to the Python 3.6. Also, I don't have 3.7 installed.

    Making `python3` point to `python3.8` with this method broke `gnome-terminal` for me.

    @Boris Did you find a way to point to python3.8 succesfully?

    @Johny I just added `alias python="python3.8"` to `~/.bash_profile`

    @Boris Yes, I ended up doing the same.

    Don't do this. It will break `apt` like @Giacomo mentioned along with other OS components like `do-release-upgrade`. Simply use an alias instead.

    @Boris I personally do not like to clutter my .bash_profile with aliases. And by the way, what happens when you use another shell? ;)

    I had an error `update-alternatives: error: alternative link /usr/bin/python is already managed by python`. So I could not use the `update-alternatives` method. The only solution is to change the symlink as in @IRSHAD answer below.

    Works fine in Ubuntu 18.04 LTS without breaking APT. Note to those confused: if you are getting the `error: no alternatives for python` message, then you need to run the `--install` commands following first (replacing the python versions you want to use as appropriate, and the numbers at the end are just for order) then you run the `--config` command again and you will be asked which version you want to use by default.

  • You can achieve this by applying below simple steps -

    1. Check python version on terminal - python --version
    2. Get root user privileges. On terminal type - sudo su
    3. Write down the root user password
    4. Execute this command to switch to python 3.6 -
      update-alternatives --install /usr/bin/python python /usr/bin/python3 1
    5. Check python version - python --version
    6. Done.

    Works fine on Ubuntu 18.04. so simple than other solutions. thanks a lot

    This worked: `sudo update-alternatives --set python /usr/bin/python3.7 python --version`

    Also works on Pop! OS

    What is the point of step 3?

    @goonerify it's the second half of step 2

    @Sam-T your comment didn't work for me. I am on Debian 10 & this worked for me `sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7 1; python --version`

    steps 2 & 3 (and 1 really) are unnecessary. just do `sudo update-alternatives --install ...` (as a user in the sudo group or entry in the /etc/sudoers file) and enter your own password when prompted. best practice suggests the root user not even have a password or be allowed to connect via SSH (so that you CAN'T log in as it). see eg:

  • Using these commands can help you:

    1. check the version of python: ls /usr/bin/python*
    2. alias: alias python='/usr/bin/pythonxx' (add this to . ~/.bashrc)
    3. re-login or source . ~/.bashrc
    4. check the python version again: python --version

    thanks but after restarting the computer the main python would be still the ex python 2.7

    You should add the script to modify the default in ~/.bashrc. Then you will make it work forever.

    like this: export python=/home/xxx (your py3 directory)

    You forgot to mention that the alias definition needs to go **in the bashrc**. Otherwise it only affects the current terminal session.

  • Create symlink for /usr/bin/python3. In my LinuxMint:

    # ls -lh /usr/bin/python3 /usr/bin/python
    lrwxrwxrwx 1 root root 9 ноя 24  2017 /usr/bin/python -> python2.7
    lrwxrwxrwx 1 root root 9 сен  6  2017 /usr/bin/python3 -> python3.5
    # mv /usr/bin/python /usr/bin/python.bak
    # cp /usr/bin/python3 /usr/bin/python
    # python --version
    Python 3.5.2

    This broke apt installer.

  • the first check do you python3.6 folder

    ls /usr/bin/python3.6

    if you have folder like python3.6 good to go

    then update-alternatives

    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1

    now update new config for python3

    sudo update-alternatives --config python3

    check python version

    python3 --version

  • An easy answer would be to add an alias for python3.6.

    Just add this line in the file ~/.bashrc : alias python3="python3.6", then close your terminal and open a new one. Now when you type python3 xxx it gets translated to python3.6 xxx.

    This solution fixes your problem without needing to tweak your system too heavily.

    EDIT :

    As Mikael Kjær pointed out, this is a misconfiguration of ansible with your system.

    As seen here :

    Set the ansible_python_interpreter configuration option to /usr/bin/python3. The ansible_python_interpreter configuration option is usually set per-host as an inventory variable associated with a host or group of hosts:

      # Example inventory that makes an alias for localhost that uses python3
      localhost-py3 ansible_host=localhost ansible_connection=local

    As seen here about the config file :

    Changes can be made and used in a configuration file which will be processed in the following order:

    * ANSIBLE_CONFIG (an environment variable)
    * ansible.cfg (in the current directory)
    * .ansible.cfg (in the home directory)
    * /etc/ansible/ansible.cfg

    Actually, I am installing ansible , which supports only > python 3.5

    You can set the `ansible_python_interpreter` variable to use your python3.6.

    @MikaelKjær I just added your comment to my answer

  • if you have multiple version of python in your system. You just need to update the symbolic link of python inside /usr/bin/

    [email protected]:/usr/bin# ls -lrth python*
    lrwxrwxrwx 1 root root    9 Apr 16  2018 python -> python2.7
    -rwxr-xr-x 1 root root 3.6M Nov 12  2018 python2.7
    -rwxr-xr-x 2 root root 4.4M May  7 14:58 python3.6

    In above example if you see the output of python --version you will get python2.7

    Now update the python symlink using below command-

    [email protected]:/usr/bin# unlink python
    [email protected]:/usr/bin# ln -s /usr/bin/python3.6 python
    [email protected]:/usr/bin# python --version
    Python 3.6.8
  • You can change the simbolic link by ln -sf python3.6 python3 inside /usr/bin. With this when you call python3 it will execute python3.6

  • update-alternatives is to change system symlinks to user-defined/admin-defined symlinks. If you have multiple versions of python3 installed in your system and want to control which python3 version to invoke when python3 is called. Do the following

    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.4 1
    sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 2

    Run below command if you want to change priority in the future.

    update-alternatives --config python3


    sudo update-alternatives --install <symlink_origin> <name_of_config> <symlink_destination> <priority>

    You can go on change name_of_config to python4, but then you have to invoke update-alternatives --config with python4 to reconfigure.

    Using this approach you are able to control system python version and python3 version separately.

License under CC-BY-SA with attribution

Content dated before 6/26/2020 9:53 AM