在Linux上有两个版本的Python,如何将2.7设置为默认版本。

134

我在我的Linux电脑上安装了两个Python版本:

$python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 


$ /usr/local/bin/python2.7
Python 2.7.3 (default, Oct  8 2013, 15:53:09) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

$ which python
/usr/bin/python
$ ls -al /usr/bin/python
-rwxr-xr-x. 2 root root 4864 Jul 10 22:49 /usr/bin/python

如何将Python 2.7设置为默认版本,使得在输入 python 后进入的是2.7版本?


1
当我在我的 Fedora 上这样做时,yum 或 apt-get 就不能再工作了。 - User
@用户:是的,我也曾经破坏过一台古老的Mandrake(将“/usr/bin/env python”更改为2.6而不是2.3意味着“rpm”中的一半命令和所有“urpmi”命令都停止工作)。 - abarnert
我按照以下步骤在Centos 5上安装Django:第一步,从源代码安装Python 3.6。第二步,在shell中输入以下命令“alias python=/usr/local/bin/python3.6”。第三步,运行以下命令安装Django:“pip3 install Django”。第四步,“python -m django --version”验证已安装Django版本为“1.10.5”。 - showmyroutes
对我来说,/usr/bin/python 是指向 python2 的软链接。我刚刚将其更改为 python3.6 - munish
7个回答

181

你可能并不想改变默认的Python。

你的发行版在/usr/bin中安装了一个标准系统Python,并且可能有一些脚本依赖于此,选择使用#! /usr/bin/env python。通常情况下,你可以在2.7中运行2.6的Python脚本,但是你想冒这个风险吗?

此外,更改/usr/bin可能会破坏软件包管理器管理软件包的能力。而且改变你的PATH目录的顺序会影响到除Python之外的很多其他东西。(实际上,将/usr/local/bin放在/usr/bin之前更为常见,可能是你真正想要的,但如果你将它们放反了,那么可能有充分的理由。)

但是,你不需要改变默认的Python就可以让系统在你输入python时运行2.7。


首先,你可以设置一个shell别名:

alias python=/usr/local/bin/python2.7

如果您希望更改默认的Python版本,可以在命令提示符中输入以下内容或将其放入您的~/.bashrc中(如果您希望更改是持久的)。这样,当您键入python时,它会运行您选择的Python 2.7版本,但当系统上的某个程序尝试使用/usr/bin/env python运行脚本时,它会运行标准的Python 2.6版本。


另外,您也可以为Python 2.7创建一个虚拟环境(或为不同的项目创建单独的虚拟环境),并在虚拟环境中进行操作。


1
:( 你说得对。不幸的是,我已经按照@rohit的答案创建了一个新的符号链接。现在我的yum命令无法工作!我尝试重新创建符号链接,但它不起作用:sudo ln -sf /usr/bin/python2.6 /usr/bin/python 有什么解决方法吗? - Anthony
@Anthony:我猜/usr/bin/python之前实际上不是一个符号链接,而是一个包装脚本或可执行文件,现在你已经覆盖了它,无法恢复。如果rpm仍然可用,你可以手动下载Python软件包并在没有yum的情况下安装它。 - abarnert
当我输入 python2.6 时,我仍然可以进入2.6解释器,所以它仍然存在。 - Anthony
7
@Anthony:如果将来有人告诉你要修改 /usr/bin(或者除了 /usr/local 之外的任何 /usr 目录),请记下那里有什么内容并备份... - abarnert
我已经取消链接2.7.2,并将Python脚本复制到/usr/bin。现在当我键入python时,它会显示“-bash:/usr/local/bin/python:没有那个文件或目录”。有没有办法让我输入python时运行我复制到/usr/bin中的脚本? - Anthony
显示剩余6条评论

21

/usr/local/bin添加到您的PATH环境变量中,并将其排在/usr/bin之前。

通常情况下,这是在您的shell的rc文件中完成的,例如对于bash,您可以将其放置在.bashrc文件中:

export PATH="/usr/local/bin:$PATH"

这将使您的shell在使用/usr/bin中的Python之前,首先查找/usr/local/bin中的Python。

(当然,这意味着您还需要确保/usr/local/bin/python指向python2.7 - 如果没有,请创建符号链接。)


可能需要适当设置PYTHONHOME或者在已经设置的情况下取消它。 - Marcin
1
这并不像那些建议更改 /usr/bin 本身的解决方案那样危险...但我仍然认为这不是 OP 实际想要的。 - abarnert
这对我在从Ubuntu 14.x升级到16.x后有所帮助。 - learn2day

8

输入命令

which python

//output:
/usr/bin/python

cd /usr/bin
ls -l

在这里,您可以看到类似于这样的内容

lrwxrwxrwx 1 root   root            9 Mar  7 17:04  python -> python2.7

您的默认 Python2.7 被软链接到文本“python”。

因此,请删除软链接 python。

sudo rm -r python

然后重试上述命令。
ls -l

您可以看到软链接已被删除。

-rwxr-xr-x 1 root   root      3670448 Nov 12 20:01  python2.7

接下来创建一个新的软链接指向 Python3.6:

ln -s /usr/bin/python3.6 python

然后在终端中尝试使用命令 python

//output:
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux

输入 helpcopyrightcreditslicense 以获取更多信息。


1
你的帖子并不是对楼主问题的回答。 - Frank
这个解决了我一个非常奇怪的问题。当我从根目录或普通终端检查Python版本时,它显示为3.6.8,但如果我创建一个.sh文件并在其中键入python -version,那么会打印2.7。原来是因为存在软链接,如上所述。按照步骤操作,问题已经解决。谢谢。 - S4nd33p

4

通过以下方式确认当前 Python 版本:

$ python --version

然后检查Python是否是符号链接指向哪个文件。
  $ ll /usr/bin/python

输出示例:

 lrwxrwxrwx 1 root root 9 Jun 16  2014 /usr/bin/python -> python2.7*

查看其他可用的Python版本:

$ ls /usr/bin/python*

输出示例:

/usr/bin/python     /usr/bin/python2.7-config  /usr/bin/python3.4         /usr/bin/python3.4m-config  /usr/bin/python3.6m         /usr/bin/python3m
/usr/bin/python2    /usr/bin/python2-config    /usr/bin/python3.4-config  /usr/bin/python3.6          /usr/bin/python3.6m-config  /usr/bin/python3m-config
/usr/bin/python2.7  /usr/bin/python3           /usr/bin/python3.4m        /usr/bin/python3.6-config   /usr/bin/python3-config     /usr/bin/python-config

如果要将当前版本的Python更改为3.6版本,请编辑文件~/.bashrc:
vim ~/.bashrc

在文件末尾添加以下行并保存:

alias python=/usr/local/bin/python3.6

为了安装 Python 3.6 版本的 pip,请参照以下步骤:
$ sudo apt-get install python3.6 python3.6-dev
$ sudo curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python3.6
$ sudo easy_install pip

成功后,检查当前的pip版本:

$ pip3 -V

输出示例:

pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.6)

2

所有的操作系统都自带一份默认版本的Python,它位于 /usr/bin 目录下。所有随操作系统附带的脚本(例如 yum)都指向 /usr/bin 目录下的这个 Python 版本。

如果你想要安装一个新版本的 Python,你不希望破坏已经存在的脚本,因为这些脚本可能无法与新版本的 Python 兼容。

正确的做法是将 Python 安装为另一个版本。

e.g.
wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2 
tar xf Python-2.7.3.tar.bz2
cd Python-2.7.3
./configure --prefix=/usr/local/
make && make altinstall

现在通过这样做,现有的脚本如yum仍然可以使用/usr/bin/python。 您的默认python版本将是安装在/usr/local/bin中的版本。 也就是说,当您键入python时,您将得到2.7.3。
这是因为$PATH变量在usr/bin之前有/usr/local/bin。
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

如果Python2.7仍然不能作为默认的Python版本生效,您需要执行以下操作:
export PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"

1

最简单的方法是使用以下三个命令来帮助您设置:

从 Python 2.x 到 3.x

  1. 查看 Python 版本,使用 python --version(让您知道已安装的版本是 2.7.x)
  2. 找到安装了Python 3的位置,使用 which python3(或者 which python 给出当前安装的 Python 版本)
  3. 最后一步,使用别名,alias python=/usr/bin/python3.6(在上一步中找到的那个)
  4. 现在再次运行 python --version,您会发现已经安装了 3.6.x

从 Python 3.x 到 2.x(几乎相同)

  1. 查看Python版本,使用python --version(让您获得已安装的版本为3.6.x)
  2. 找到安装了Python 2的位置,使用which python2which python会告诉您当前安装的Python版本所在位置)
  3. 最后一步,使用别名,alias python=/usr/bin/python2.7(根据上一步获取的信息)
  4. 现在再次运行python --version,您将发现已安装2.x.x版本。

-8

我猜你手动安装了2.7版本,而2.6是从软件包中安装的?

简单的答案是:卸载Python软件包。

更复杂的答案是:不要在/usr/local中手动安装。使用2.7版本构建一个软件包,然后进行升级。

软件包处理取决于你使用的发行版。


5
Python包几乎肯定是发行版所必需的。CentOS基于RPM,而一半的RPM和YUM工具都是用Python编写的。 - abarnert
亲爱的迈克尔, 请告知如何卸载手动安装的Python2.7! - AVA
简单的解决方案是删除 /usr/local/ 下的所有内容,但这样做将删除您手动编译和安装的所有内容。在 /usr/local 中无法很好地跟踪哪些文件属于哪些软件,因此通常不建议在该位置安装任何东西。也许你只有Python。如果 /usr/local/bin 只包含Python可执行文件,则很有可能删除不会破坏其他任何东西。 - emesik
2
你永远不应该卸载Python。相信我,我曾经这样做过,结果导致我的系统崩溃。很多应用程序都依赖于它,这是非常不明智的行为。 - Patrick Mutwiri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接