How to update-alternatives to Python 3 without breaking apt?
Per Debian policy, python
refers to Python 2 and python3
refers to Python 3. Don't try to change this system-wide or you are in for the sort of trouble you already discovered.
Virtual environments allow you to run an isolated Python installation with whatever version of Python and whatever libraries you need without messing with the system Python install.
With recent Python 3, venv
is part of the standard library; with older versions, you might need to install python3-venv
or a similar package.
$HOME~$ python --versionPython 2.7.11$HOME~$ python3 -m venv myenv... stuff happens ...$HOME~$ . ./myenv/bin/activate(myenv) $HOME~$ type python # "type" is preferred over which; see POSIXpython is /home/you/myenv/bin/python(myenv) $HOME~$ python --versionPython 3.5.1
A common practice is to have a separate environment for each project you work on, anyway; but if you want this to look like it's effectively system-wide for your own login, you could add the activation stanza to your .profile
or similar.
replace
[bash:~] $ sudo update-alternatives --install /usr/bin/python python \/usr/bin/python2.7 2[bash:~] $ sudo update-alternatives --install /usr/bin/python python \/usr/bin/python3.5 3
with
[bash:~] $ sudo update-alternatives --install /usr/local/bin/python python \/usr/bin/python2.7 2[bash:~] $ sudo update-alternatives --install /usr/local/bin/python python \/usr/bin/python3.5 3
e.g. installing into /usr/local/bin
instead of /usr/bin
.
and ensure the /usr/local/bin
is before /usr/bin
in PATH.
i.e.
[bash:~] $ echo $PATH/usr/local/bin:/usr/bin:/bin
Ensure this always is the case by adding
export PATH=/usr/local/bin:$PATH
to the end of your ~/.bashrc
file. Prefixing the PATH
environment variable with custom bin folder such as /usr/local/bin
or /opt/<some install>/bin
is generally recommended to ensure that customizations are found before the default system ones.
As I didn't want to break anything, I did this to be able to use newer versions of Python3 than Python v3.4 :
$ sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.6 1update-alternatives: using /usr/bin/python3.6 to provide /usr/local/bin/python3 (python3) in auto mode$ sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.7 2update-alternatives: using /usr/bin/python3.7 to provide /usr/local/bin/python3 (python3) in auto mode$ update-alternatives --list python3/usr/bin/python3.6/usr/bin/python3.7$ sudo update-alternatives --config python3There are 2 choices for the alternative python3 (providing /usr/local/bin/python3). Selection Path Priority Status------------------------------------------------------------* 0 /usr/bin/python3.7 2 auto mode 1 /usr/bin/python3.6 1 manual mode 2 /usr/bin/python3.7 2 manual modePress enter to keep the current choice[*], or type selection number: 1update-alternatives: using /usr/bin/python3.6 to provide /usr/local/bin/python3 (python3) in manual mode$ ls -l /usr/local/bin/python3 /etc/alternatives/python3 lrwxrwxrwx 1 root root 18 2019-05-03 02:59:03 /etc/alternatives/python3 -> /usr/bin/python3.6*lrwxrwxrwx 1 root root 25 2019-05-03 02:58:53 /usr/local/bin/python3 -> /etc/alternatives/python3*