IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    X_AirDu发表于 2016-08-02 09:59:25
    love 0

    笔者序

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

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

    准备工作

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

    • 确保当前系统安装了gcc。

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

    • 在更新Python版本前,安装好需要使用的库(所有要安装的库必须兼容新版本,即Python2.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版本改为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即可。

    图-1 yum无法使用

    其他库和模块

    很多时候安装了新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)方法中可以解决sqlite3的import问题,但使用过程中会出现其他异常,这里一定要注意。

    至此,Python升级完成。

    后记

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

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



沪ICP备19023445号-2号
友情链接