为了应对不同开发环境共存的要求,经常需要在centos上安装多个版本的python。这里我对此做一个总结。

1.升级centos的系统缺省应用程序到最新版本

yum -y update

2.安装开发工具包

centos缺省不包含很多软件开发常用的工具包,所以需要安装。

yum groupinstall -y 'development tools'
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

注意,如果不在编译安装python之前就把这些工具包装好,python安装时就不会link这些软件模块。

3.其它安装python之前考虑的安装选项

  • UNICODE支持 

python对unicode的支持已经有很多年了,python3.2之前的版本如果没有特别需求,应该在configure时用--enable-unicode=ucs4选项激活UTF-32; 对于python3.2,则是--with-wide-unicode

  • Shared library

现代linux的发行版配置的python都是编译成share library方式,有些第三方软件如mod_wsgi 和Blender必须要这样才能正常运行。但是,如果把python编译成share library,就必须告知如何才能找到这个library。有两种办法达到这个目的:
  1. 通过在configure命令的最后加入LDFLAGS="-Wl,-rpath /usr/local/lib"选项把路径编译到可执行文件里面去

  2. 编辑文件/etc/ld.so.conf,把路径/usr/local/lib加入到文件的最后一行。然后运行命令/sbin/ldconfig让动态链接器更新设置。

#注意:有时候需要在python安装完之后再运行ldconfig命令,更新设置才生效。建议使用办法1,直接在可执行文件里面写死路径。
  • 编译时使用“make altinstall"命令

这个命令非常重要,因为如果使用常规的"make install"命令,会导致编译生成的可执行程序文件中有一个文件名字是python,他会与系统自带的python版本程序混淆,并可能引发难以诊断的错误。

4.缺省程序安装路径

python缺省安装路径是/usr/local,可以在configure时候用

--prefix=

选项修改它到其它路径。但是如果这么做了,就需要修改PATH变量,把新的路径加入进去。



5.下载,编译和安装python


# Python 2.7.11:

wget 

https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tar.xz

xz -d Python-2.7.11.tar.xz

tar xf Python-2.7.11.tar

cdPython-2.7.11

./configure--prefix=/usr/local--enable-unicode=ucs4--enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib" 

make&&makealtinstall

 

# Python 3.5.1:

wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz

xz -d Python-3.5.1.tar.xz

tar -xvf Python-3.5.1.tar

cdPython-3.5.1

./configure--prefix=/usr/local--enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"  

make && make altinstall   


# Python 3.3.6:

wget https://www.python.org/ftp/python/3.3.6/Python-3.3.6.tar.xz

xz -d Python-3.3.6.tar.xz 

tar -xvf Python-3.3.6.tar

cd Python-3.3.6

./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"  

make&&makealtinstall   

6.下载和安装setuptools和pip工具

#下述命令来自setuptools官网https://pypi.python.org/pypi/setuptools/

wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py

python2.7 ez_setup.py --insecure
python3.3 ez_setup.py --insecure    #在centos6.8上执行python3.5.1有问题(运行时会hang), python3.3.6则正常

上述命令在执行过程中会在目录/usr/local/bin生成两个文件:easy_install-xx和easy_install文件。这两条命令执行按照上述次序执行完成后,目录/usr/local/bin有三个文件示例如下。

[root@localhost ~]# ll /usr/local/bin/easy*

-rwxr-xr-x. 1 root root 332 Jun 22 00:15 /usr/local/bin/easy_install

-rwxr-xr-x. 1 root root 340 Jun 21 14:56 /usr/local/bin/easy_install-2.7

-rwxr-xr-x. 1 root root 340 Jun 22 00:15 /usr/local/bin/easy_install-3.3

[root@localhost ~]# file /usr/local/bin/easy_install-2.7

/usr/local/bin/easy_install-2.7: a /usr/local/bin/python2.7 script text executable

[root@localhost ~]# file /usr/local/bin/easy_install-3.3

/usr/local/bin/easy_install-3.3: a /usr/local/bin/python3.3 script text executable

[root@localhost ~]# file /usr/local/bin/easy_install

/usr/local/bin/easy_install: a /usr/local/bin/python3.3 script text executable

可以看出在安装了多个python版本的系统里,应该指定easy_install的版本来运行

执行以下命令为不同版本python安装pip模块:

/usr/local/bin/easy_install-2.7 pip

/usr/local/bin/easy_install-3.3 pip

命令执行后,目录/usr/local/bin下会生成如下pip程序:

-rwxr-xr-x. 1 root root   290 Jun 22 07:07 pip

-rwxr-xr-x. 1 root root   292 Jun 22 06:59 pip2

-rwxr-xr-x. 1 root root   296 Jun 22 06:59 pip2.7

-rwxr-xr-x. 1 root root   292 Jun 22 07:07 pip3

-rwxr-xr-x. 1 root root   296 Jun 22 07:05 pip3.3

可以看出,对应不同版本python也有不同的pip程序,我们可以如下格式使用pip安装python package

pip2.7install[packagename]

pip2.7install--upgrade[packagename]

pip2.7uninstall[packagename]


7.为python2安装virtualenv沙盒 ---virtualenv是python2上运行的最常见沙盒模块

由于python3内含沙盒环境pyenv,所以不需要安装virtualenv

/usr/local/bin/pip2.7 install virtualenv

安装会在目录/usr/local/bin生成文件:virtualenv,示例如下:

[root@localhost ~]# ll /usr/local/bin/virtu*

-rwxr-xr-x. 1 root root 220 Jun 22 07:20 /usr/local/bin/virtualenv

[root@localhost ~]# file /usr/local/bin/virtualenv

/usr/local/bin/virtualenv: a /usr/local/bin/python2.7 script text executable

8.用virtualenv创建不同版本python的沙盒环境

前提是这些版本的python基础程序已经安装前述办法安装在系统中了

virtualenv --python=/usr/local/bin/python2.7 /sandbox/v27

virtualenv --python=/usr/bin/python2.6 /sandbox/v26

virtualenv --python=/usr/local/bin/python3.3 /sandbox/v33

virtualenv --python=/usr/local/bin/python3.5 /sandbox/v35


9.激活使用virtualenv的沙盒

source /home/lb/sanbox/v_26/bin/activate   #激活沙盒v_26

(v35) [root@localhost lb]# python --version     #执行需要的命令

deactivate                #退出沙盒

10.使用pyvenv创建不同版本python的沙盒环境---pyvenv是python3的内置沙盒模块

pyvenv使用相对更加简单,系统安装的每个版本python3,都在目录/usr/local/bin有对应该版本的pyvenv-3.x程序。

这个程序只能创建对应其版本的沙盒环境,即pyvenv-3.1程序只能创建python3.1的沙盒环境,而pyvenv-3.3程序只能创建python3.3的沙盒环境。

使用示例如下:

[root@localhost sanbox]# pyvenv-3.5 t35        ###在当前目录下创建python3.5的沙盒t35

[root@localhost sanbox]# source ./t35/bin/activate    ###激活沙盒t35

(t35) [root@localhost sanbox]# python --version     ###验证沙盒t35的python版本

(t35) [root@localhost sanbox]# deactivate         ###退出沙盒t35

由此可以看出pyvenv只能建立和管理python3的沙盒环境,virtualenv这可以同时建立和管理python2和python3的沙盒环境。

具体pyvenv使用方法看:https://github.com/yyuu/pyenv#command-reference