截止目前,centos6系列的最新版本是centos6.9,内置的python版本依然是2.6.6,出于api和abi的稳定性考虑,redhat是不会自己升级python版本的,但是,很多时候我们非常需要使用较新的版本,由于python是系统默认集成的,即使是最小化安装的系统,默认已经自带了python,如果自己安装不当,很可能对系统造成破坏。本文主要就是在centos6.9上面安装Python2.7.15版本进行说明,如果你要安装Python3.x系列,理论上应该是一样的。
首先是环境准备:
yum install gcc zlib-devel expat-devel bzip2-devel sqlite-devel \ openssl-devel readline-devel gdbm-devel ncurses-devel xz-devel tk-devel
注意,前面几个包都是Python编译安装需要的,有些组件,db4-devel可以选装。
下载python:
curl -L -O https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tar.xz
解压安装:
tar xf Python-2.7.15.tar.xz cd Python-2.7.15 ./configure --enable-ipv6 --enable-shared \ LDFLAGS="-Wl,-rpath /usr/local/lib" \ --with-system-expat --with-system-ffi \ --enable-unicode=ucs4 \ --with-ensurepip=install make -j${nproc} make altinstall
如果要在标准目录下安装,可以这样
cd Python-2.7.15 curl -L -O https://src.fedoraproject.org/rpms/python2/raw/master/f/00102-2.7.13-lib64.patch curl -L -O https://src.fedoraproject.org/rpms/python2/raw/master/f/python-2.7-lib64-sysconfig.patch curl -L -O https://src.fedoraproject.org/rpms/python2/raw/master/f/00104-lib64-fix-for-test_install.patch patch -p1 < 00102-2.7.13-lib64.patch patch -p1 < python-2.7-lib64-sysconfig.patch patch -p1 < 00104-lib64-fix-for-test_install.patch
配置可以这样配置:
./configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64 --localstatedir=/var --sharedstatedir=/var/lib \ --enable-ipv6 --enable-shared --enable-unicode=ucs4 --with-system-expat --with-system-ffi \ --enable-optimizations LDFLAGS='-Wl,-z,relro -Wl,-z,now' --with-ensurepip=install make -j4 make altinstall
如果你用更高版本的gcc,configure的时候可以加上优化选项
./configure --with-ensurepip=install --enable-optimizations
在centos6自带的低版本gcc(4.4.7)下,优化选项好多特性不支持,所以会报错。
最后的提示应该是类似这样的:
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-9.0.3 setuptools-39.0.1
稍微解释下配置,–with-ensurepip=install是同步安装pip和easy_install,现在的python源码自带此功能,加个参数就能开启了。默认的安装路径是/usr/local, 这里也没有变更。最后不用make install是怕替换系统已有的组件,所以用make altinstall。我们的主程序是python2.7和pip2.7。
我们查看下版本:
python2.7 -V
输出结果:
Python 2.7.15
有时,我们不想用python2.7来执行,想直接用python命令执行新版本的python,我们可以做个软连接。
ln -sf /usr/local/bin/python2.7 /usr/bin/python
这里会把老的2.6的python执行程序替换掉,但不用担心,/usr/bin/python2.6这个程序其实是个硬连接文件,2.6的执行程序还在的。
因yum只能在python2.6下运行,我们把yum脚本改下环境:
vim /usr/bin/yum
把文件开始的#!/usr/bin/python改成#!/usr/bin/python2.6即可。
再把pip的软连接做下:
ln -s /usr/local/bin/pip2.7 /usr/bin/pip
好了,大功告成,需要注意的是,我们已经把主执行程序改成了python2.7,除了yum需要改环境外,不排除其他的python脚本出问题,所以要不要对python2.7做软连接还是取决于你,但这个好处是如果我们想切换回来,系统原先的2.6的python其实都还在,可以随时恢复回去。
更好的建议是,我推荐安装scl的源安装python,这个原理有点像python中的虚拟环境,一点也不影响系统原先的组件,可以随时切换,大家可以看下我以前的这篇文章。