Linux上的两个版本的python。如何使2.7成为默认值


124

我的linuxbox上有两个版本的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

如何将2.7设置为默认版本,以便在键入python时将其置于2.7版本?


1
当我对我的软呢帽执行此操作时,yum或apt-get不再起作用。
用户

@User:是的,我同样也破坏了一个古老的Mandrake(更改/usr/bin/env python为2.6,而不是2.3,意味着其中的一半命令rpmurpmi停止了工作)。
abarnert

我已按照以下步骤在Centos 5:1st上安装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
取消了

Answers:


173

您可能实际上不想更改默认的Python。

您的发行版在中安装了标准系统Python /usr/bin,并且可能具有依赖于此脚本的脚本,并由选择#! /usr/bin/env python通常,您可以在2.7中运行Python 2.6脚本,但是您要冒险吗?

最重要的是,闲逛/usr/bin可能会破坏您的包管理器管理包的能力。并且更改目录中的顺序PATH将影响除Python以外的许多其他因素。(实际上,在/usr/local/bin之前更常见/usr/bin,这可能是您真正想要的-但是如果您有其他选择,则可能有充分的理由。)

但是,您无需更改默认的Python即可在键入时使系统运行2.7 python


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

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

在提示符下键入该命令,或者~/.bashrc如果您想使更改持久化,则将其放入您的计算机,现在键入该命令时python将运行您选择的2.7,但是当系统上的某个程序尝试使用/usr/bin/env python标准2.6 运行该脚本时。


或者,只需在2.7(或针对不同项目的单独venv)中创建一个虚拟环境,然后在venv中进行工作。


1
:(你是对的。不幸的是,我已经按照@rohit的回答创建了一个新的symb链接。现在我的yum命令不起作用了!我尝试创建回sym链接,但是它没有sudo ln -sf /usr/bin/python2.6 /usr/bin/python任何解决方法?
Anthony

@Anthony:我的猜测是/usr/bin/python以前实际上不是符号链接,它是包装脚本或可执行文件,现在您已覆盖它并且无法将其取回。如果rpm仍然有效,则可以手动下载Python软件包并安装,而无需安装yum
2013年

我输入时仍可以进入2.6解释器,python2.6因此它仍然存在。
安东尼

7
@Anthony:将来,如果有人告诉您更改/ usr / bin(或/ usr中/ usr / local以外的任何位置)中的内容,请记下其中的内容并进行备份…
abarnert

我让自己陷入困境!我有另一个centos框,其中可能包含该脚本。如果我从那里复制它,并将其放在此框的/ usr / bin中。你认为这行得通吗?
安东尼

19

添加/usr/local/bin到您的PATH环境变量中,在列表中早于/usr/bin

通常,这是在您外壳的rc文件中完成的,例如,对于bash,您可以将其放入.bashrc

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

这将导致你的shell先寻找一个python/usr/local/bin,它会与一个之前/usr/bin

(当然,这意味着您还需要/usr/local/bin/python指向python2.7-如果尚未指向,则需要对其进行符号链接。)


可能有必要适当地设置PYTHONHOME或将其取消设置(如果它是通过某种方式设置的)。
Marcin 2013年

1
这几乎不像建议更改/ usr / bin本身的解决方案那么危险……但是我仍然认为这不是OP真正想要的。
abarnert

从Ubuntu 14.x升级到16.x之后,这对我有所帮助
Learn2day 16-10-19

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)

3

输入命令

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'

所以删除softlink 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
您的帖子不是OP问题的答案。
法兰克

这为我解决了一个非常奇怪的问题。当我从根目录或普通终端检查python版本时,它显示3.6.8,但是如果我创建一个.sh并在其中键入python -version,则显示2.7。原来是因为如上所述存在软链接。按照步骤操作,并已修复。谢谢。
S4nd33p

谢谢!这为我解决了“必需的python 3或更高版本”的问题
Tamim Attafi

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"

-8

我想您手动安装了2.7版本,而2.6是从软件包中获得的?

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

比较复杂的是:不要在/ usr / local中手动安装。用2.7版本构建软件包,然后升级。

包处理取决于您使用的发行版。


5
发行版几乎肯定需要Python软件包。CentOS是基于RPM的,一半RPM和YUM工具是用Python编写的。
abarnert

亲爱的迈克尔:请告知选项,以卸载手动安装的python2.7!
AVA 2015年

简单的解决方案是删除/ usr / local /下的所有内容,但是通过这种方式,您可以删除已手动编译和安装的所有内容。没有很好的方法来跟踪哪些文件属于/ usr / local中的哪个软件,因此通常不建议安装任何文件。也许那里只有python。如果/ usr / local / bin仅包含python可执行文件,则删除很有可能不会破坏其他任何内容。
emesik

2
您不应该卸载python。从我这里拿走。我做到了,它破坏了我的系统。许多应用程序都依赖它。这是非常不明智的。
帕特里克·穆特维里
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.