在Ubuntu上安装了Python,但是无法找到Python命令。

我在我的Ubuntu 18.04上安装了Python 2.7和Python 3.7,但是当我输入"python"时,它显示的是...
  Command 'python' not found, but can be installed with:

  sudo apt install python3       
  sudo apt install python        
  sudo apt install python-minimal

  You also have python3 installed, you can run 'python3' instead.

但是我已经安装了Python。

3你说你安装了pythonpython3?但它们两个本来就已经被安装了(比如说Lubuntu 18.04 LTS,它自带的版本是Python 3.6)。你是怎么安装它们的?你有没有移除或替换掉预装的版本?我怀疑你的问题可能出在$PATH上,也就是说你移除了原本在路径中的预装版本,安装到其他地方或者将$PATH修改成了不同于默认设置的值。 - guiverc
我安装了Python 3.7。 - Boni
我问你是如何安装它们的。如果你使用了命令,history 可以帮助你回忆起来。在我的 Lubuntu 上,whereis python 告诉我它的位置,而命令 echo $PATH 则显示了被搜索的命令目录列表。我所建议的可能在你的系统上出现了损坏,或者如果你是从源代码安装的(这就是我为什么问你如何安装的原因),它可能被安装在 $PATH 默认之外。如果我输入 python --version,我的系统会回应 2.7.16,而 python3 --version 则回应 3.7.3(注意:我没有使用 18.04 版本,所以很可能是较新的版本)。你有删除任何东西吗?它是如何安装的? - guiverc
虽然人们已经指出了各种让python调用Python 3的方法,但是你为什么不能直接运行python3呢?如果有原因的话,值得解释一下是什么原因。 - Colin Watson
5个回答

根据评论的建议,您可以按照以下方式创建一个别名:

alias python='python3'

通过将其添加到文件的末尾,退出并重新加载当前终端中的文件,使用以下命令:. ~/.bashrc 或者使用链接:
如下所示,我的python指向python2python2指向python2.7
要实现相同效果,请使用:
sudo ln -s /usr/bin/python2.7 /usr/bin/python2 
sudo ln -s /usr/bin/python2 /usr/bin/python

如果你想将python指向第三个版本,你可以使用相同的方法,但是最后一个命令应该是:
sudo ln -s /usr/bin/python3 /usr/bin/python

例子

$ whereis python
python: /usr/bin/python3.7 /usr/bin/python2.7-config /usr/bin/python2.7 /usr/bin/python3.7m-config /usr/bin/python3.7-config /usr/bin/python /usr/bin/python3.7m /usr/lib/python3.7 /usr/lib/python2.7 /usr/lib/python3.8 /etc/python3.7 /etc/python2.7 /etc/python /usr/local/lib/python3.7 /usr/local/lib/python2.7 /usr/include/python3.7 /usr/include/python2.7 /usr/include/python3.7m /usr/share/python /usr/share/man/man1/python.1.gz
user@lenovo:~$ ls -ailh /usr/bin/python*
1446954 lrwxrwxrwx 1 root root    7 жов 10 14:32 /usr/bin/python -> python2
1446952 lrwxrwxrwx 1 root root    9 жов 10 14:32 /usr/bin/python2 -> python2.7
1465834 -rwxr-xr-x 1 root root 3,6M лис  7 12:07 /usr/bin/python2.7
1447155 lrwxrwxrwx 1 root root   33 лис  7 12:07 /usr/bin/python2.7-config -> x86_64-linux-gnu-python2.7-config
1447156 lrwxrwxrwx 1 root root   16 жов 10 14:32 /usr/bin/python2-config -> python2.7-config
1442842 lrwxrwxrwx 1 root root    9 лют 12 00:23 /usr/bin/python3 -> python3.7
1449245 -rwxr-xr-x 2 root root 4,9M лис 20 11:21 /usr/bin/python3.7
1447339 lrwxrwxrwx 1 root root   33 лис 20 11:21 /usr/bin/python3.7-config -> x86_64-linux-gnu-python3.7-config
1449245 -rwxr-xr-x 2 root root 4,9M лис 20 11:21 /usr/bin/python3.7m
1447340 lrwxrwxrwx 1 root root   34 лис 20 11:21 /usr/bin/python3.7m-config -> x86_64-linux-gnu-python3.7m-config
1447341 lrwxrwxrwx 1 root root   16 жов  2 15:31 /usr/bin/python3-config -> python3.7-config
1442843 -rwxr-xr-x 1 root root  384 січ 30  2019 /usr/bin/python3-futurize
1442847 lrwxrwxrwx 1 root root   10 лют 12 00:23 /usr/bin/python3m -> python3.7m
1447342 lrwxrwxrwx 1 root root   17 жов  2 15:31 /usr/bin/python3m-config -> python3.7m-config
1442844 -rwxr-xr-x 1 root root  388 січ 30  2019 /usr/bin/python3-pasteurize
1447157 lrwxrwxrwx 1 root root   14 жов 10 14:32 /usr/bin/python-config -> python2-config
1455649 lrwxrwxrwx 1 root root   58 лип 10  2019 /usr/bin/pythontex -> ../share/texlive/texmf-dist/scripts/pythontex/pythontex.py
1450999 -rwxr-xr-x 1 root root  306 лип 10  2019 /usr/bin/pythontex3

为了管理Python3版本,你可以使用python alternatives来创建符号链接:
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2

选择要使用的命令,并决定使用哪一个。
$ sudo update-alternatives --config python3

要使用update-alternatives管理python2和python3,请参见迈克尔的答案。


4在操作系统的根目录/usr/bin/下直接进行更改并不是一个好主意。这样做可能会导致未来升级时出现问题。更好的方法是安装python-is-python3(仅适用于20.04或更新版本),使用每个用户的别名alias python=python3,或者直接运行python3 - Colin Watson
包装系统假设它拥有/usr/bin/(以及/usr/local/之外的一般/usr/),并且用户不会直接在那里写入。如果违反此规则,即使看似相对无害,任意问题可能会发生。 - Colin Watson
这是否属实完全不清楚。原帖中提到他们安装了Python 2.7和3.7,但Ubuntu 18.04默认安装的是2.7和3.6版本,所以他们可能在做一些奇怪的事情。有可能他们以非标准的方式安装了Python,而不是通过软件包管理系统安装,所以也许他们实际上并没有安装python包。 - Colin Watson
@ColinWatson 是对的,使用别名而不是符号链接更安全,因为其他系统级包依赖可能仍然需要python2。更多信息请查看这里 - amartin1911
谢谢,那个方法有效。只需要在添加别名后重新启动终端,否则它无法工作。 - Liker777

这个解决方案仅适用于Ubuntu 20.04(但有时人们会查看“类似问题”以寻找解决方案)。
如果你希望使用python来引用python3,你可以简单地安装python-is-python3
sudo apt-get install python-is-python3

在这之后,调用python将会正常工作。

4这是对20.04的好建议,但OP询问的是18.04,在那里python-is-python3不存在,并且操作系统的其他部分没有准备好将/usr/bin/python作为Python 3使用,如果强制使用可能会导致不可预测的失败。 - Colin Watson
1哎呀,谢谢Colin,我没检查18.x版本的包是否存在,真抱歉。我已经修改了答案,明确指出只适用于20.x版本,有时这很有用,因为Stack Overflow的用户可能会在这里寻找类似的问题。但如果你认为删除答案更好...那我就删掉它。 - Fabiano Tarlao
2看起来你已经很谨慎地限定了它,这似乎是合理的。谢谢。 - Colin Watson
安装python-is-python3和运行alias python='python3'有什么区别?我猜python-is-python3只是运行了那个别名命令。 - jspinella
...或者在某个位置创建一个符号链接,但是我认为这里接受的答案可能会有用:https://askubuntu.com/questions/1296790/python-is-python3-package-in-ubuntu-20-04-what-is-it-and-what-does-it-actually - Fabiano Tarlao
1@jspinella 有很大的区别。alias命令是临时的,只在发出命令的会话中有效,并且只对交互式命令有效(即在脚本中,python不会被识别为命令)。python-is-python3安装了一个实际的/usr/bin/python,它是一个指向/usr/bin/python3的符号链接,因此在几乎所有情况下,python永久等于python3。所以它们完全不同。 - raj
1所以alias是临时的,而python-is-python3安装了一个符号链接来永久地将python指向python3python-is-python3不会安装python3,并假设python存在于usr/bin/python3 - jspinella
1太棒了!一下子就成功了,它在Debian GNU/Linux 11(bullseye)容器上运行。非常感谢@FabianoTarlao。 - skg
适用于Ubuntu 22.04:已安装python3和python-is-python3。显然,新软件应明确指定python2或python3,而不是python。此软件包添加了一个指向python3的符号链接。 - Daniel
这在我的Zorin OS 16.1上有效。谢谢。 - nrnw

我遇到了同样的错误。
Ubuntu:/$ python

Command 'python' not found, but can be installed with:

sudo apt install python3       
sudo apt install python        
sudo apt install python-minimal

You also have python3 installed, you can run 'python3' instead.

你可以试一试
Ubuntu:/$ python2.7
Python 2.7.17 (default, Nov  7 2019, 10:07:09) 
[GCC 7.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 

这个 如何使“python”程序命令执行Python 3? 将帮助创建Python别名。


另一个适用于不同(以及较旧)版本的Ubuntu的选项是“alternatives”系统,可以使用命令行update-alternatives(应该已安装)或GUI galternatives(默认未安装)。当您有多个版本或完全不同但兼容的实现(例如编译器、编辑器)时,它允许您配置您的“首选”版本(请参见此示例: update-alternatives --get-selections)。
要查看当前默认的Python版本(注意:这些是指向特定版本的符号链接):
$ type python python2 python3
python not found
python2 is /usr/bin/python2
python3 is /usr/bin/python3

通常(就是总是,没有例外)你希望默认的pythonpython2,出于兼容性的考虑(否则会破坏apt和其他系统工具!),只有在真正需要Python3时才显式地调用python3
要查看当前为python配置的可选项:
$ sudo update-alternatives --list python
error: no alternatives found

如果找到了替代方案,请跳过以下步骤(参见下面的--config)。否则,我们可以将python2和python3都配置为"alternatives"命令,并且您可以在它们之间切换(或者只需在此处设置python2并完成;其余部分是为了完整性和练习而提供):
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 40
using /usr/bin/python2 to provide /usr/bin/python (python) in auto mode    

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 20
using /usr/bin/python3 to provide /usr/bin/python (python) in auto mode   

$ type python
/usr/bin/python

$ python --version
Python 2.7.18

重要!如果您的默认Python显示为python3,请在此更改为python2,否则apt和其他系统工具可能会出现问题!

要使用update-alternatives更改当前选择的版本,请按照以下步骤进行,并选择您想要的版本:

$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

Selection    Path                Priority   Status
------------------------------------------------------------
* 0          /usr/bin/python2     40         auto mode
  1          /usr/bin/python2     40         manual mode
  2          /usr/bin/python3     20         manual mode
Press <enter> to keep the current choice[*], or type selection number: 0

要完全删除所有的python备选配置(例如,重新开始,或者如果出现任何奇怪的情况,撤销所有操作):
$ sudo update-alternatives --remove-all python

1谢谢你指出这一点。我之前在一个旧版的Ubuntu安装中(小于20.01)犯了个大错误,试图为了向前兼容性而将python2设置为默认版本,并通过别名将python指向python3,结果导致所有东西都停止工作,我一直不明白原因。现在我知道我错在哪里了。 - Ivan

大多数时候,你必须使用关键字python3来运行代码,而不仅仅是在py上使用python,否则这些代码将无法按预期工作。

1这并不是对问题的回答。一旦您有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Hippo

  • 相关问题