偶然间翻出一篇去年帮公司安装开发环境后记下的关于Python
安装的笔记,特来向你们分享。python
犹记得当时Python
版本切换的问题困扰了我,以及整个项目组很久,由于按照正常的方法,安装Python
自己没有问题,且能基本使用,但使用的过程当中出现了大量包引用以及其余问题,后来发现这一切和本地库的路径,以及系统编码和Python源码编码的冲突有关,本文会着重说明。linux
Python2.7.9
源码包:Python-2.7.9.tgz。sql
确保当前系统安装了gcc
。vim
确保当前系统能够安装rpm
包。bash
在更新Python
版本前,安装好须要使用的库(全部要安装的库必须兼容新版本,即Python2.7.9
),如tkinter
,sqlite
等。python2.7
在终端输入python
进入Python
解释器界面,输入以下内容:编码
import sys print sys.maxunicode
若是结果<=65535
,跳过第3
步。[1]
spa
解压缩Python-2.7.9.tgz
文件,而后进入Python-2.7.9
源码目录下。操作系统
打开configure
文件,找到have_ucs4_tcl=no
(大概在13047
行),将其改成have_ucs4_tcl=yes
,保存并退出。[2]
code
在终端执行命令./configure --prefix=/usr/local/
,而后执行make && make install
编译安装。
在终端执行命令ln -sf /usr/local/bin/python2.7 /usr/bin/python
,将系统默认Python
版本改成Python2.7.9
。
在终端执行python -V
查看当前版本。
[1]:若是sys.maxunicode <= 65535
,则当前系统下Python
环境编码为UCS2
,> 65535
则为UCS4
,新环境须要与其一致。
[2]:该行是决定当前Python
编译后编码的关键,改为yes
则为UCS4
。
升级Python
版本之后,会出现图-1
所示yum
没法使用的状况,这是由于yum
自己是Python
写的,而CentOS-6.5
下的yum
不支持Python2.7.9
,这时候咱们须要编辑/usr/bin/yum
文件的第一行:#!/usr/bin/python
,将其改成#!/usr/bin/python2.6
便可。
不少时候安装了新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
环境使用本地库有两种方法:
把本地库的路径添加到系统环境变量中,执行vim ~/.bashrc
编辑环境变量文件,在文件末尾加上export PYTHONPATH=$PYTHONPATH:/usr/lib64/python2.6/lib-dynload/:/Other paths:/…
,不一样路径用冒号分割,再执行source ~/.bashrc
当即在当前终端生效,全局生效须要重启操做系统。
把所需的库复制或移动到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
版本的,不管哪一个版本,都可参考本文,原理大同小异。