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


331

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


30
只是警告:请勿尝试将/ usr / bin / python符号链接更改为指向python3而不是2.7。Ubuntu仓库中的许多程序都需要/ usr / bin / python与python 2.x兼容。
soulsource

1
啊,现在我明白了升级的含义了……实际上,Ubuntu开发人员正在为此工作:wiki.ubuntu.com/Python/3 “ Ubuntu 14.04 LTS的发行目标是在桌面CD上仅包含Python 3图片。”
soulsource

1
另一个要注意的是,任何来这里是因为他们试图学习将Python 3设置为默认设置的人,都可以在研究虚拟环境(例如virtualenv)或容器(例如LXC或Docker)中找到用处。
凯文(Kevin)

1
关于顶部的soulsource警告,请参阅PEP 394,该规范对共存的Python可执行文件的命名约定进行了标准化,以及Python程序员和程序包维护者所依赖(并且应该)依赖于它们。
David Foerster,

2
@wjandrea是的,即使在虚拟环境中python也应保持其含义python2。我的意思是说,我的评论是一种拥有特定于应用程序的Python版本的方式,而不是尝试解决系统的Python。
凯文

Answers:


370

一种简单安全的方法是使用别名。将其放入~/.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)

4
实际上,我想清除2.7并将其替换为3.3。似乎现在是个坏主意
。– Giri

35
+1没有理由清除2.7以便能够使用3.3。由于许多软件仍依赖于2.7;只要保持它徘徊。
don.joey

6
@begueradj 别名符号链接完全不同。
RaduRădeanu2014年

1
请注意:这可能会破坏其他需要Python 2.7的脚本。
kmiklas

85

[2016年6月]推荐的过渡信息位置是Ubuntu Python官方页面。


Ubuntu Wiki

对于Ubuntu和Debian,我们都有持续的项目目标,以使Python 3成为发行版中默认的首选Python版本。

不是什么意思:

  • /usr/bin/python将指向Python3。不,这不会发生(除非PEP 394提倡否则,这在可预见的将来是可疑的)。/usr/bin/python并且/usr/bin/python2将指向Python 2.7版和/usr/bin/python3将指向支持的最新的Python 3版本。

  • Python 2将从存档中删除。不,这不会发生。鉴于PEP 373承诺到2020年之前都将提供上游错误修复维护支持,因此我们预计Python 2.7会在Ubuntu中长期保持支持并可用。

由于其他软件包的依赖性,不建议更改符号链接,但是它们“具有使Python 3成为发行版中默认的首选Python版本的持续项目目标”。


对于CLI使用,像@RaduRădeanu,我建议把一个别名用户~/.bashrc.bash_aliases文件(不同的文件,包括~/.bash_profile被加载至少一次,大多是为了组织的目的,也可以通过平台而异)。Python 虚拟环境也可以正常工作。

别名示例:

alias python=python3

要么

alias python='/usr/bin/python3'

脚本仍应使用类似的东西#!/usr/bin/env python3来实现交叉兼容性。

使用env非常适合与虚拟环境混合使用。

注意(由于@wjandrea):别名是bash运行时的一部分,而不是用户环境。因此,shebang(#!)无法使用它们。如果您更喜欢使用别名python = python3,则program.py可以通过调用别名解释器来执行某些没有shebang的操作python program.py。别名对于同时具有多个版本的python3(例如3.4和3.6)的系统也可能有用。


1
现在看来这已经过时了:他们计划在Xenial中删除python2,但后来没有这样做。
OrangeDog

1
@OrangeDog,感谢您的更新。是的,我引用的Wiki页现在被标记为过时,因为在过去两年中,仅使用Python 3已经取得了更多进展。跟随这一进展的新页面是Ubuntu Python官方页面
凯文

关于Xenial的计划,“最新”页面也已过时。
OrangeDog

我不会说它“已过时”,而不会说“它最近未更新”。似乎仍然是关于此事的当前位置。但是,在这里的评论中,我将不胜感激任何人都可以找到的任何其他近期消息。python在转换完成之前,为我的答案添加更多有关为什么不将其更改为just的信息并没有真正意义。即使那样,它也可能只是一个非问题。
凯文

2
别名是Bash内部的,不是环境的一部分,因此您仍然需要python3在shebang中使用,而不是python
wjandrea

28

更新:我知道这是错误的方法,因为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版本。


19
python2和python3不是替代品。为此,请勿使用更新替代方法。
jobin

他们为什么不呢?你们其中一位可以解释为什么update-alternatives不适合python吗?是因为legacy.python.org/dev/peps/pep-0394吗?
德米特里·格里戈列耶夫

11
替代方案是相同功能的不同实现。python2和python3不提供相同的功能。
2016年

如果您手动(通过ppa或其他方式)安装了其他版本的python3,则可以执行类似的操作。sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 2
David Baucum

这是我需要为没有python的18.04.2 vm执行的操作。谢谢
黑暗之星1

9

Ubuntu和其他Linux发行版在许多应用程序和命令上仍然很大程度上依赖于Python 2.7。如果将“ python”的默认引用更改为Python 3.x,则许多Python函数将开始引发断言错误。

例如,在Ubuntu上,除非您直接编辑文件并将shebang更改为引用“#!/ usr / bin / env python2.7”,否则“ pip”将不再正确运行。在Red Hat,Fedora和CentOS等RHEL(Red Hat Enterprise Linux)版本上,“ Yum”命令还依赖于Python 2.7。

我的意思是,您将导致大量代码开始引发断言错误,因此您可以在终端中键入“ python”以引用Python3.x。

您可以在终端中使用“ python3”命令,而在Python 3.x文件中使用shebang“#!/ usr / bin / env python3”则更好。


2

cd ~
gedit .bash_aliases

然后写

alias python=python3

要么

alias python='/usr/bin/python3'

保存文件,关闭终端,然后再次打开。
链接


1

你可以符号链接/usr/bin/pythonpython3

sudo ln -s /usr/bin/python3 /usr/bin/python

并且可以防止将Python 2和pip2作为依赖项安装

sudo apt-mark hold python python-pip

有关为什么您可能不想这样做的信息,请参见其他答案。Ubuntu 18.04+不再附带Python 2,因此它应该还不错。


2
关于“ Ubuntu 18.04不再随Python 2一起提供,因此它应该还不错。” ,在Ubuntu(甚至默认情况下未安装Python 2的版本)上,一个名为的可执行文件python被假定为Python 2,因此这可能会破坏某些东西。
wjandrea

* python->/usr/bin/python
wjandrea

0
cat > /usr/local/bin/py
#!/bin/dash
python3 "$@"
<CTRL-D>

(假设您具有对/ usr / local / bin的写许可权)

cat > /usr/local/bin/pyi
#!/bin/dash
python3 -i "$@"
<CTRL-D>

那么您只需为所选的python输入py(并在#!行中使用py)。


使用符号链接会更简单吗?sudo ln -s /usr/bin/python3 /usr/local/bin/py
wjandrea

0

我发现仅删除/ usr / bin / python和/ usr / bin / pip非常有帮助。这迫使所有程序都依赖“ python2”和“ python3”命令。

尽管有些可选的和过时的软件包依赖于#!/usr/bin/python工作,但我宁愿向这些程序提交补丁,也不愿继续犯怪异的错误,有时甚至难以调试。


-1

update-alternatives由于兼容性问题,您可以用来提供在不同时间可能需要的不同版本的程序。

例如,此答案是一个很好的示例,说明如何设置内容以同时维护不同版本的gcc / g ++。

只需对python2.7和python 3.3做同样的事情


2
初学者可能无法轻松地将链接的答案适应其他情况。除了记下较早的答案,最好列出Python所需的步骤。
2013年

这里是我找到很好的一步一步的解决方案linuxconfig.org/...
woto

Python 2和3不是替代品-甚至没有不同的次要版本(例如)。这种方法很容易破坏东西。
wjandrea

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.