笔者序
偶然间翻出一篇去年帮公司安装开发环境后记下的关于Python
安装的笔记,特来向大家分享。
犹记得当时Python
版本切换的问题困扰了我,以及整个项目组好久,因为按照正常的方法,安装Python
本身没有问题,且能基本使用,但使用的过程中出现了大量包引用以及其他问题,后来发现这一切和本地库的路径,以及系统编码和Python源码编码的冲突有关,本文会着重说明。
准备工作
Python2.7.9
源码包:Python-2.7.9.tgz。确保当前系统安装了
gcc
。确保当前系统可以安装
rpm
包。在更新
Python
版本前,安装好需要使用的库(所有要安装的库必须兼容新版本,即Python2.7.9
),如tkinter
,sqlite
等。
安装过程
-
在终端输入
python
进入Python
解释器界面,输入如下内容:import sys print sys.maxunicode
如果结果
<=65535
,跳过第3
步。[1]
解压缩
Python-2.7.9.tgz
文件,然后进入Python-2.7.9
源码目录下。打开
configure
文件,找到have_ucs4_tcl=no
(大概在13047
行),将其改为have_ucs4_tcl=yes
,保存并退出。[2]
在终端执行命令
./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
。
环境完善
yum
升级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
版本的,无论哪个版本,均可参考本文,原理大同小异。