CentOS 6.5下源码编译安装Python 2.7

阅读:3078

发布时间:2017年11月18日 20:38

Python

站主序

这篇文章我最早发表在```SegmentDefault```上,传送门在这儿:CentOS-6.5源码编译安装Python2.7.9。现在自己的网站也搭起来了,就打算把这文章移到这里,给大家分享。

前言

```CentOS 6.5```自带的```Python```版本为```2.6```,当时在公司,需要搭建一个```Python 2.7```的开发环境,但拿到的系统是```CentOS 6.5```,于是就有了这个奇怪的需求。

这里我要多一句嘴,无论是```Windows```,还是```Linux```、Mac OS下,如果要搭建多```Python```版本的环境,最为推荐的方法一定是类似```virtualenv```这种虚拟环境隔离工具,或者是```Anaconda```这样的一键式环境工具,强行改```Python```版本这种事,能不干就别干,坑奇多无比,而且还不知道有没有后遗症。

关于```virtualenv```这类虚拟环境工具的使用方式,我将在以后的文章中为大家介绍。

这篇文章也是在当时公司特殊环境下的特殊需求下总结出来的,犹记得当时这个```Python```环境的问题困扰了我,也困扰了我的整个项目组很久。因为按照强行更改```Python```版本的正常办法,安装```Python```本身没有任何问题,并且能基本使用(进入```Python```解释器),但使用过程中却出现了大量包引用(```import```)以及其他问题,后来发现这一切和本地库的路径,以及系统编码与```Python```源码编码之间的冲突有关,下文会重点说明。

准备工作

  • ```Python 2.7.9```源码包(当时使用的```2.7.9```版本)Python-2.7.9.tgz
  • 确保当前系统安装了```gcc```。
  • 确保系统可以使用```rpm```命令安装```rpm```包。
  • 在更新```Python 2.7.9```前,安装好需要使用的库(兼容```2.7.9```版本的库,如```tkinter```,```sqlite```等)。

安装过程

1.在终端输入python,进入Python解释器,输入以下代码:

import sys
print sys.maxunicode

如果结果<=65535,则跳过第```3```步(重要)。```[1]```

2.解压缩```Python-2.7.9.tgz```文件,然后进入```Python 2.7.9```源码目录下。

3.打开```configure```文件,找到```have_ucs4_tcl=no```(大概在```13047```行),将其改为```have_ucs4_tcl=yes```,保存并退出。```[2]```

4.在终端执行命令```./configure --prefix=/usr/local```,然后执行make&&make install编译安装。

5.在终端执行命令```ln -sf /usr/local/bin/python2.7 /usr/bin/python```,将系统默认```Python```版本改为```Python 2.7.9```。

6.在终端执行```python -V```查看当前```Python```版本。

笔者注

[1]:如果sys.maxunicode <= 65535,则当前系统下```Python```环境编码为```UCS2```,> 65535则为```UCS4```,新环境需要与其一致。

[2]:决定当前```Python```编译后编码的关键,改成```yes```则为```UCS4```。

环境完善

yum

升级Python版本后,会出现下图所示的yum无法使用的状况,这是因为yum本身也是Python写的,而CentOS 6.5下的yum不支持Python 2.7.9,这时候我们需要编辑/usr/bin/yum文件的第一行:#!/usr/bin/python,将其改为#!/usr/bin/python2.6,指向到自带的Python原版本即可。

其他库和模块

很多时候安装了新```Python```环境后,会出现大量```ImportError```的异常情况——尽管我们在升级环境前已经安装好了那些库。

这种时候我们的第一反应往往是重新安装这些库,但这样会非常麻烦(如果库比较多),并容易造成本地库的重复和冗余,而且有部分库在重新安装了以后依然无法使用(譬如```sqlite3```),此时我们只需要让新```Python```使用本地库即可(这也是在准备工作阶段说过的那些安装的库必须兼容```Python 2.7.9```环境的原因),具体操作如下:

1.在终端执行```/usr/bin/python2.6```,进入系统自带的```Python 2.6```的解释器,执行如下代码:

import sys
print '\n'.join(sys.path)

查看本地所有Python库的路径,一般如下:

/usr/lib64/python26.zip
/usr/lib64/python2.6
/usr/lib64/python2.6/plat-linux2
/usr/lib64/python2.6/lib-tk
/usr/lib64/python2.6/lib-old
/usr/lib64/python2.6/lib-dynload
/usr/lib64/python2.6/site-packages
/usr/lib/python2.6/site-packages

退出解释器,执行python命令进入当前Python环境的解释器,并执行同样的代码获取Python 2.7的库目录:

/usr/local/lib/python27.zip
/usr/local/lib/python2.7
/usr/local/lib/python2.7/plat-linux2
/usr/local/lib/python2.7/lib-tk
/usr/local/lib/python2.7/lib-old
/usr/local/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/site-packages

2.让新Python环境使用本地库的方法有两种:

  • 把本地库添加到系统环境变量中。执行```vim ~/.bashrc```编辑环境变量文件,在文件末尾加上export PYTHONPATH=$PYTHONPATH:/usr/lib64/python2.6/lib-dynload/:/Other paths:/…,不同路径使用冒号分隔,再执行source ~/.bashrc立即在当前终端生效,全局生效需要重启操作系统。
  • 把所需的库复制或移动到```Python 2.7```的对应目录下,譬如```sqlite3```会抛```ImportError: No module named _sqlite3```异常,只需要将```/usr/lib64/python2.6/lib-dynload/_sqlite3.so```文件放到```/usr/local/lib/python2.7/lib-dynload/```目录下即可。

前面在安装过程中涉及到一个安装编码的问题,如果```Python2.7```的编码与本机```Python```编码不一致,```Python2.7```将无法使用本地库,表面上在上述第二种方法中可以解决```sqlite3```的```import```问题,但使用过程中可能会出现其他异常,这里一定要注意

至此,```Python```升级完成。

后记

正如开头所说,因为当时项目条件的原因,才有了CentOS 6.5下源码编译安装Python2.7的奇怪需求,实际开发中,建议大家直接使用自带Python2.7的Linux版本,会省去许多麻烦。即使真的需要更改Python版本,也建议采用virtualenv之类的办法。

当然了,本文中所陈述的Python环境的更改方法,对于LinuxPython,无论使用任何版本,均可参考本文,原理大同小异。