为什么Python 2.7仍然是Ubuntu的默认Python版本?

根据Python的官方文档,Python2.7的支持将在不久的将来结束。
引用: "DEPRECATION: Python 2.7将于2020年1月1日结束其生命周期。请升级您的Python版本,因为在此日期之后将不再维护Python 2.7。未来版本的pip将不再支持Python 2.7。有关pip中Python 2支持的更多详细信息,请访问https://pip.pypa.io/en/latest/development/release-process/#python-2-support"
为什么Ubuntu在即将发布的版本中不使用Python3作为默认版本呢?
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="19.04 (Disco Dingo)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 19.04"
VERSION_ID="19.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=disco
UBUNTU_CODENAME=disco

$ python
Python 2.7.16 (default, Apr  6 2019, 01:42:57) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.

2你可以安装Python3.7软件包。问题是,在Ubuntu/Linux Mint版本中,有时仍然存在旧的软件,所以你必须手动安装更新的软件包。 - enigma
8@enigma 这不是那个问题的重复,因为ラビナン丹的系统已经默认安装了Python3,所以他同时安装了Python和Python3。 - karel
3个回答

根据Bionic Beaver的发布说明:
Python 2不再默认安装。Python 3已更新至3.6版本。这是最后一个LTS版本在主要功能中包含Python 2的发布。
上述陈述是正确的。在18.04及之后的版本中,默认情况下不再安装Python 2。Ubuntu已经将几乎所有项目从Python 2迁移到Python 3。例如,根据Disco Dingo的发布说明:
Samba已更新至4.10.x版本,其中的一个重大变化是对python3的支持。在Disco中,samba及其依赖现在全部只支持python3,除了tdb。tdb仍然构建一个python2软件包,即python-tdb,但其他所有软件包,包括samba本身,都只支持python3。
此外,在发布Ubuntu 18.04之前,Ubuntu/Canonical就开始要求开发者转向Python 3,因为末日将至。来自Python - Ubuntu Wiki的内容如下: 现在所有Ubuntu/Canonical驱动的开发都应该针对Python 3,并且所有新代码应该只使用Python 3。如果由于依赖堆栈的原因你无法做到这一点,请与我们沟通。
看起来在您的系统中,Python 2是有意安装的,或者可能作为某些其他软件包的依赖项而安装的,而其开发者尚未转向Python 3。您可以通过运行命令检查已安装的依赖Python 2的软件包。
apt rdepends python --installed

当运行python时,Python 2被调用的原因在于PEP 394 -- The "python" Command on Unix-Like Systems中的一个历史点:

python命令应始终调用Python 2(以防止在Python 3上运行Python 2代码时出现难以诊断的错误)。

在较新的版本(如20.04)中,Ubuntu提供了两个软件包:
python-is-python2/focal,focal 2.7.17-4 all
  symlinks /usr/bin/python to the DEPRECATED python2

python-is-python3/focal,focal 3.8.2-4 all
  symlinks /usr/bin/python to python3

根据名称,前者将使python调用python2,后者将调用python3。如果您没有依赖于Python 2的应用程序,可以安装python-is-python3来使python调用python3。或者,您还可以编辑脚本的shebang为/usr/bin/python3,以使脚本直接使用python3作为解释器。

14要澄清最后一点,Python 3与Python 2不兼容。再加上Python 2有比Python 3更多的库支持,这意味着很多开发者仍然直接依赖于Python 2。Python 3已经发布了一段时间,但实际上是库的原因导致Python 2仍然被广泛使用,尽管它根本不应该再得到支持(如果我没记错的话,官方支持在2018年结束)。编辑:官方支持在2020年结束。 - searchengine27
13你有证据支持这个说法吗?我很少再遇到不支持Python 3的库了,事实上有些库已经停止对Python 2的支持了!比如说,Django,一个流行的Python Web框架,在三个版本中就不再支持Python 2。你的说法在五年前可能是有道理的,但是今天如果没有统计数据来支持这种概括性的说法,我认为你不能这样笼统地下结论。 - marcelm
8@searchengine27 我认为图书馆的支持并不是关键因素。向后兼容的问题在于世界上存在着大量以#!/usr/bin/python或等效方式开头的随机脚本,如果python变成了python3,这些脚本将会出错;而依赖Python 3的随机脚本更有可能以#!/usr/bin/python3开头。 - James_pic
2很久以前,有人制作了一个名为“Python3 Wall of Shame”的网站,列出了最常见的依赖项及其Python3状态(当时情况非常糟糕)。然而,现在已经过去了几年,该网站已更改为“Python 3 Wall of Superpowers”(https://python3wos.appspot.com/),因为几乎所有常见的依赖项都已迁移,而那些没有迁移的依赖项也已经死亡(自2018年4月以来该网站未更新,因为现在基本上所有东西都可以在Python3上运行)。 - Giacomo Alzetta
5只是作为补充:Python软件基金会将在2020年停止维护Python 2,并不意味着Canonical将在2020年停止维护Python 2。事实上,使用来自信誉良好的供应商的Linux发行版的全部目的是,该发行版中的所有软件包(对于Debian/Ubuntu来说,即“main”仓库)将在整个发行版生命周期内得到维护,而不管原始上游软件包的支持状态如何。换句话说,Ubuntu 19.04中的Python 2软件包将与Ubuntu 19.04一样得到维护。 - Jörg W Mittag
1尽管这个回答解决了问题的核心(即误认为python命令是Ubuntu中的“默认Python版本”,而实际上在最新的Ubuntu发行版中,它甚至不再默认安装),但我认为如果您能将有关官方Ubuntu软件仓库中对Python 2相关包(或一般包)支持的评论扩展成自己的答案,那将非常有帮助。我认为这将解答OP和其他读者想要了解的很大一部分内容。当然,这取决于您。 - Eliah Kagan
@searchengine27 我也认为很久以前,Python 3 在库和其他流行包方面的支持较少,但现在看来所有这些都已经被 Python 3 支持了。而且由于 Python 2 将来将不再得到开发者社区的支持,使用最新版本的 Python 是一个好的实践。 - ラビナンダン
Python的命令应该始终调用Python 2,这让我想哭。 - setholopolus

据我所知,只有Arch Linux做到了:通过默认的python命令调用python3。尽管PEP 394建议这样做。
可以在/usr/bin中通过重新定义python、pythonX和pythonX.Y之间的链接来进行更改。但是要准备好应对很多错误,因为你所有的python2脚本都必须有一个明确的shell bang。
#!/usr/bin/env python2

一个在旧脚本中很少使用的shell bang。

我正在分享我的实时经验,
尽管我在我的机器上安装了Python3.6,但我的系统默认指向Python2.7。
但是当我尝试下载Python3.6的新包时,它却使用默认的Python2.7进行下载。
所以我找到了这个pyenv,
我安装了pyenv,
安装完成后,
 $ pyenv install --list
 $ pyenv global

指向默认系统(Python2.7)
安装了Python3.6
$ pyenv install 3.6.9

从Python2.7更改为Python3.6
$ pyenv global 3.6.9

假设你想安装与Python2.7相关的软件包,那么就需要更改Python环境。
$ pyenv global 2.7.0