CentOS-6.5源码编译安装Python2.7.9

笔者序

偶然间翻出一篇去年帮公司安装开发环境后记下的关于Python安装的笔记,特来向大家分享。

犹记得当时Python版本切换的问题困扰了我,以及整个项目组好久,因为按照正常的方法,安装Python本身没有问题,且能基本使用,但使用的过程中出现了大量包引用以及其他问题,后来发现这一切和本地库的路径,以及系统编码和Python源码编码的冲突有关,本文会着重说明。

准备工作

  • Python2.7.9源码包:Python-2.7.9.tgz

  • 确保当前系统安装了gcc

  • 确保当前系统可以安装rpm包。

  • 在更新Python版本前,安装好需要使用的库(所有要安装的库必须兼容新版本,即Python2.7.9),如tkintersqlite等。

安装过程

  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版本改为Python2.7.9

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

笔者注:

[1]:如果sys.maxunicode <= 65535,则当前系统下Python环境编码为UCS2> 65535则为UCS4,新环境需要与其一致。
[2]:该行是决定当前Python编译后编码的关键,改成yes则为UCS4

环境完善

yum

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

《CentOS-6.5源码编译安装Python2.7.9》

其他库和模块

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

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

1.在终端执行/usr/bin/python2.6,进入系统原自带Python2.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环境的解释器,并执行同样命令获取Python2.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环境使用本地库有两种方法:

  1. 把本地库的路径添加到系统环境变量中,执行vim ~/.bashrc编辑环境变量文件,在文件末尾加上export PYTHONPATH=$PYTHONPATH:/usr/lib64/python2.6/lib-dynload/:/Other paths:/…,不同路径用冒号分割,再执行source ~/.bashrc立即在当前终端生效,全局生效需要重启操作系统。

  2. 把所需的库复制或移动到Python2.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将无法使用本地库,表面上在上述2)方法中可以解决sqlite3import问题,但使用过程中会出现其他异常这里一定要注意

至此,Python升级完成。

后记

因为当时项目条件的原因,才有了CentOS-6.5下源码编译安装Python2.7的奇怪需求,实际开发中,建议大家直接使用自带Python2.7Linux版本,会省去许多麻烦。

当然了,有时候也确实会因为环境升级,项目迭代等原因需要更新Python版本的,无论哪个版本,均可参考本文,原理大同小异。

    原文作者:X_AirDu
    原文地址: https://segmentfault.com/a/1190000006141348
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞