如何使“python”程序命令执行Python 3?

Python程序命令执行Python 2。使用python3命令可以执行Python 3。如何使用python命令执行Python 3?

47只是一个警告:不要尝试将 /usr/bin/python 的符号链接更改为指向 python3 而不是 2.7。在 Ubuntu 存储库中提供的许多程序都需要 /usr/bin/python 兼容于 python 2.x。 - soulsource
@soulsource,是的,我知道这一点。所以我问是否有“升级”选项可用。 - Giri
我认为Radu Rădeanu的答案已经非常接近最佳解决方案了。它只适用于单个用户,并且仅对直接运行Python命令的情况有效,不会影响带有#!/usr/bin/python shebang的程序。 - soulsource
1啊,现在我明白你说的升级是什么意思了...实际上Ubuntu的开发人员正在处理这个问题:https://wiki.ubuntu.com/Python/3 "将Python 3作为Ubuntu 14.04 LTS桌面CD镜像的发布目标。" - soulsource
@soulsource 这就是我正在寻找的!:) 谢谢! - Giri
2另外一件事,任何因为想要了解如何将Python 3设置为默认版本而来到这里的人,可能会发现研究虚拟环境(例如virtualenv)或容器(例如LXC或Docker)更有用。 - Kevin
1关于soulsource在顶部的警告,请参考PEP 394,该标准化了共存的Python可执行文件的命名约定,Python程序员和软件包维护人员依赖(并应该依赖)此规范。 - David Foerster
@Kevin 我刚尝试使用了一个虚拟环境,但是一旦我从终端打开 Gedit,就会收到一堆错误,因为它的插件似乎需要 Python 2。任何依赖于命令“python”是 Python 2 的其他软件也可能遇到类似的问题。 - wjandrea
2@wjandrea,是的,即使在虚拟环境中,“python”应该保持为“python2”的意思。我的意思是通过使用特定于应用程序的Python版本,而不是试图绕过系统的Python来解决问题。 - Kevin
如果你是一个在家里运行Python程序的用户,一个安全而保守的解决方案是将alias python='echo Python2 is too old. Please run python3'添加到你的.bashrc文件中。 - user334639
1sudo apt install python-is-python3 (适用于 Ubuntu 20.04+) - user677955
8个回答

你可以安装一个系统范围的软件包:
$ sudo apt install python-is-python3

请注意以下事项: Ubuntu 20.04中的python-is-python3软件包 - 它是什么,它实际上是做什么的? 一个简单而安全的方法是使用别名。将以下内容放入~/.bashrc~/.bash_aliases文件中:
alias python=python3

在文件中添加上述内容后,运行source ~/.bashrcsource ~/.bash_aliases
例如:
$ python --version
Python 2.7.6
$ python3 --version
Python 3.4.3
$ alias python=python3
$ python --version
Python 3.4.3

使用内置命令command来规避别名。
$ command python --version
Python 2.7.6

另一种绕过别名的方法是在命令前使用\
$ \python --version 
Python 2.7.6

要在当前的shell中禁用别名,请使用内置命令unalias
$ unalias python
$ python --version
Python 2.7.6

1没有“升级”选项吗? - Giri
@Giri 你说你有 python3。升级是为了什么? - Radu Rădeanu
4实际上,我想将2.7彻底清除并用3.3替换掉。现在看来这似乎不是一个好主意。 - Giri
51+1 没有理由清除2.7以便能够使用3.3。因为还有很多软件依赖于2.7;只需让它继续存在即可。 - don.joey
不是别名 = 符号链接吗?我问这个问题是因为我读到这种方式设置默认的Python版本不是一件好事。 - user284234
11@begueradj 别名(alias)与符号链接(symbolic link)完全不同。 - Radu Rădeanu
3虽然这样可以让您运行Python3,但不允许您从源代码安装软件包。'python setup.py build' 将构建Python3代码,但 'python setup.py install' 会将其放置在您的Python2 site-packages目录中。 - timbo
python2 别名为 python,并养成指定使用哪个的习惯,这样不是更好吗? - ryanjdillon
1你需要对每个Python命令都进行相同的操作,包括pip、pylint、pytest等。创建一个虚拟环境将是一个更好的解决方案。 - rtaft
1一个(不完全建议的)实现方法是更改你的符号链接(sl):cd /usr/bin,然后 sudo rm python 以删除该符号链接,并且 sudo ln -s python3.6 python(在执行之前请检查你的版本)。如果需要,你仍然可以使用 python2.7。这种方法不被推荐,因为会涉及其他软件包的依赖关系,但我一直在使用它,并且长时间以来没有遇到任何问题。根据自己的风险承担能力使用。 - sdlins
@wjandrea,不是我说的吗? - sdlins
我的CRON仍然在使用我旧的Python2版本。 - Umair Ayub
5警告一句话:这可能会破坏其他依赖于Python 2.7的脚本。 - kmiklas
@don.joey 你好,如何让我的终端永久执行py3代码而不是默认的py2? - Infinite Loops
@InfiniteLoops 这个答案实际上就是解释了这个。使用一个别名。 - don.joey
只是为了方便大家,我做了这个。不知道是否有必要,但它是安全的 https://pastebin.com/f3jaLKxs - user189728
13使用alias python='python3'在调用sudo python时似乎不起作用。在这种情况下,它会打开默认的Python 2.7版本。 - Mitchell van Zuylen
1这对于调用例如/usr/bin/env python的程序是无效的。 - jkflying
@kmiklas 这不会破坏脚本,因为别名不会影响脚本。例如,shebang 是由内核运行的。 - wjandrea
@jkflying 是的,你仍然需要在shebang中明确指定Python版本,例如#!/usr/bin/env python3,因为shebang是由内核运行的,不受别名的影响。 - wjandrea
在Dockerfile环境中,这对我来说行不通。 - Dan Nissenbaum
1我已经在.bashrc文件中添加了alias python=python3... 是否可以添加另一个别名来将pip3设置为默认值? - Hooman Bahreini
只是在Ubuntu 20.04上构建OpenVINO,sudo make install命令期望sudo用户是Python。接受的答案“sudo apt install python-is-python3”解决了这个问题,而别名无法解决。如果您有依赖于Python 2.7的旧代码,我建议您尝试在18.04 LTS上运行。 - brianlmerritt
1@MitchellvanZuylen 添加一个 alias sudo='sudo '。别名只适用于命令的第一个单词。在 sudo python ./foo.py -i 中,命令是 sudo,参数是 ["python", "./foo.py", "-i"],其中没有应用别名。您不希望将命令 file python 执行为 file python3。然而,将 sudo 也作为 sudo (空格很重要)的别名,使得 bash 在第一个参数上检查别名。 - 12431234123412341234123

在Ubuntu 20.04+上,只需安装python-is-python3软件包即可。
sudo apt install python-is-python3

除此之外,你可以使用apt-mark hold来阻止Python 2作为将来某个软件的依赖被安装:

sudo apt-mark hold python2 python2-minimal python2.7 python2.7-minimal libpython2-stdlib libpython2.7-minimal libpython2.7-stdlib

8我想知道为什么这对pip没有影响,或者为什么甚至没有一个相应的包pip-is-pip3 - John J. Camilleri
8Ubuntu 20.10+ 上,运行 apt install python3-pip 命令将同时安装 pippip3 命令,两者都是 Python 3 版本 - Boris Verkhovskiy
3如果您有仍然需要Python2的软件包,那么当它们被卸载时,您可能不会感到愉快的惊喜。 - unlockme
谢谢。在我的情况下,很久以前我安装了python-is-python3并忘记了这个软件包。当我在一个项目中遇到问题时,我不记得如何将python恢复为运行python2。Dhanyawaad @Boris 另外,@unlockme你是对的,我的许多(或几乎所有)python2软件包都被卸载了。所以,我不得不安装python-is-python2来恢复它们。 - Deepam Gupta
1这是唯一对我有效的方法!别名选项表现不佳。 - Javi
这直接依赖于apt中的python3软件包,因此它安装了无论我想使用我构建的确切版本的python3。 - Will

[2016年6月]有关过渡信息的推荐来源是官方的Ubuntu Python页面。


Ubuntu wiki上来的:
对于Ubuntu和Debian,我们有一个正在进行的项目目标是使Python 3成为这些发行版中默认和首选的Python版本。
这并不意味着:
- /usr/bin/python将指向Python 3。不会发生这种情况(除非PEP 394提倡其他方式,但在可预见的未来这是怀疑的)。/usr/bin/python和/usr/bin/python2将指向Python 2.7,而/usr/bin/python3将指向最新支持的Python 3版本。
- Python 2将从存档中删除。不会发生这种情况。我们预计Python 2.7将在Ubuntu中得到长时间的支持和可用性,因为PEP 373承诺提供上游错误修复维护支持直到2020年。
不建议更改符号链接,因为可能会影响其他软件包的依赖关系,但他们“正在努力将Python 3成为发行版中默认且首选的Python版本”。
对于命令行界面(CLI)的使用,就像@Radu Rădeanu一样,我建议在用户的~/.bashrc.bash_aliases文件中设置一个别名(不同的文件,包括~/.bash_profile,至少加载一次,主要用于组织目的,但可能因平台而异)。Python 虚拟环境也很好用。
别名示例:
alias python=python3

或者
alias python='/usr/bin/python3'

脚本仍然应该使用类似于#!/usr/bin/env python3的方式来实现跨平台兼容性。
使用env对于与虚拟环境混合使用非常方便。
注意(感谢@wjandrea):别名是bash运行时的一部分,而不是用户环境的一部分。因此,它们在shebang(#!)中不可用。如果你喜欢将alias python=python3作为首选,那么可以通过调用别名解释器来执行没有shebang的program.py,例如python program.py。对于同时安装了多个python3版本(如3.4和3.6)的系统,别名也可能很有用。

2这似乎已经过时了:他们计划在Xenial中移除Python2,但最终并没有这么做。 - OrangeDog
1@OrangeDog,谢谢你的更新。是的,我引用的维基页面现在被标记为过时,因为在过去两年中,在仅使用Python 3方面取得了更多进展。跟踪这一进展的新页面是官方的Ubuntu Python页面 - Kevin
"最新" 页面关于 Xenial 的计划也已经过时了。 - OrangeDog
我不会说它是“过时的”,更多的是“它最近没有更新”。它仍然似乎是保存有关此事的帖子的当前位置。但是,在这里的评论中,我会感激任何其他人可能找到的最新来源。在转换完成之前,将更多的来源添加到我的答案中,以说明为什么不要改变为只使用“python”,并不是真正相关的。即使在那时,它也可能成为一个非问题。 - Kevin
@OrangeDog,在没有Python 2的情况下拥有Xenial系统是完全可能的 - 我曾在树莓派上运行过Ubuntu Xenial Mate,它有桌面但没有python2.7。仍然有一些可选软件包(或者需要桌面体验的程序)会拉取Python 2,所以你可能正在使用这些软件包。 - Antti Haapala
Fedora的进展追踪:https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3 和 https://fedoraproject.org/wiki/Changes/Python_3_as_Default - Kevin
3别名是Bash内部的,不是环境的一部分,所以你仍然需要在shebang中使用python3,而不是python - wjandrea
@wjandrea,等一下,你是说#!/usr/bin/env pythonalias python=python3不能执行Python3吗?让我再确认一下。 - Kevin
@Kevin 是的,这正是我想说的。 - wjandrea

更新:这是错误的方法,我已经学到了,因为Python2和Python3不能互换使用。
你可以尝试使用命令行工具update-alternatives
$ sudo update-alternatives --config python

如果你碰到了“没有python的替代方案”的错误,那么可以通过以下命令自己设置一个替代方案:
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

将路径/usr/bin/python3更改为您所需的Python版本。

26Python2和Python3不是互相替代的。不要使用update-alternatives来实现这个目的。 - jobin
1为什么他们不这样做呢?你们中的一个能否解释一下为什么update-alternatives对于Python不合适?是因为http://legacy.python.org/dev/peps/pep-0394/吗? - Dmitry Grigoryev
17替代方案是为相同功能提供的不同实现。Python2和Python3不提供相同的功能。 - Ely
1如果你手动安装了其他版本的Python3(通过PPA或其他方式),你可以像这样做:sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2 - David Baucum
这是我需要为一个没有预装Python的18.04.2虚拟机所做的事情。谢谢。 - Dark Star1
怎么才能恢复到之前的状态? - Vishnudev Krishnadas
Python2和Python3并不提供相同的功能,但是它们确实有相同的功能。通过运行python2 --helppython3 --help,你会发现它们具有相同的功能。update-alternatives也可以用来在php cli版本之间切换,所以在Python版本之间进行切换也是可行的。 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 30; sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 20 - pmiguelpinto
这是我认为最好的选择。在尝试安装和运行aws-cli时,没有其他方法可以将python3作为cli使用的python可用。 - Gautam

Ubuntu和其他Linux发行版在很大程度上仍然依赖于Python 2.7来运行许多应用程序和命令。如果你将默认引用的“python”更改为Python 3.x,那么许多Python函数将开始抛出断言错误。
例如,在Ubuntu上,除非直接编辑文件并将shebang更改为“#!/usr/bin/env python2.7”,否则'pip'将无法正确运行。在RHEL(Red Hat Enterprise Linux)的变种中,如Red Hat、Fedora和CentOS,'Yum'命令也依赖于Python 2.7。
我的观点是,为了在终端中输入'python'来引用Python 3.x,你会导致大量代码开始抛出断言错误。
在终端中使用'python3'命令以及在Python 3.x文件中使用shebang '#!/usr/bin/env python3'会更好。


cd ~
gedit .bash_aliases

然后写下任何一个
alias python=python3

或者
alias python='/usr/bin/python3'

保存文件,关闭终端并重新打开。
链接

我发现简单地移除 /usr/bin/python 和 /usr/bin/pip 非常有帮助。这会强制所有程序依赖于 "python2" 和 "python3" 命令。

尽管一些可选的、过时的软件包依赖于 #!/usr/bin/python 来工作,但我宁愿向这些程序提交补丁,而不是继续犯下奇怪且有时难以调试的错误。


cat > /usr/local/bin/py << 'EOF'
#!/bin/dash
python3 "$@"
EOF

只要您对 /usr/local/bin 有写入权限,同样可以。
cat > /usr/local/bin/pyi << 'EOF'
#!/bin/dash
python3 -i "$@"
EOF

然后你只需要输入py(并在#!行中使用py)来选择你想要的Python版本。

3使用符号链接会不会更简单呢?sudo ln -s /usr/bin/python3 /usr/local/bin/py - wjandrea
2为什么要使用 pyi,当你可以将 -i 作为选项传递给 py 呢? - wjandrea