Linux安裝多個Python版本
因為環境或學習的需要,我們可能需要在服務器上安裝多個python版本,安裝一個更新的python版本后,使用軟鏈來進行共存。
這個時候需要進行源碼編譯安裝。
當然后續開發項目可以直接跑在虛擬環境下隔離開來,就不再需要在服務器上安裝多個不同版本的包了。
下載Python源碼
從http://www.python.org/download/根據需要的版本下載源文件。

例如上圖就是我在官網直接找到3.5.6版本的下載頁面,點擊的tar源碼包進行下載。
編譯安裝
補充
注意編譯安裝python前最好先保證系統己安裝上以下庫
yum install zlib
yum install zlib-devel
yum install openssl
yum install openssl-devel
yum install readline-devel
yum install gcc patch libffi-devel python-devel bzip2-devel ncurses-devel sqlite-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
解壓源碼包
tar zxvf Python-3.5.6.tgz
cd Python-3.5.6
openSUSE編譯python3找不到ssl模塊
這會導致你在配置虛擬環境后使用pip去下載包的時候報https連接的錯誤!
所以我在碰到這個情況並千辛萬苦解決后將此步驟放到這里作為重要補充,以免你像我那樣多次重新編譯(極其耗時!)
下圖是我碰到的在虛擬環境python3.5.6版本下,使用pip安裝django時報的錯,就是因為編譯安裝時沒有指定ssl。

解決辦法
由於我使用的是openSUSE的系統,所以我使用yzpper in openssl openssl-devel安裝好ssl了,但仍需要重新編譯安裝才能正確導入ssl模塊。
在這里最好直接編輯python3.5.6的源安裝配置文件,畢竟openSUSE的ssl默認並不是裝在/usr/local/ssl。
- 使用vim進行編輯:
vim ~/Python3.5.6/Modules/Setup.dist - 未編輯之前是長這樣的,有關ssl的配置集中在207-210四行中。

但我用的是openSUSE系統,所以只需要編輯208-210三行,也就是#SSL=/usr/local/ssl不要去解除注釋,以免弄巧成拙,當然我感覺要設置成我系統的/etc/ssl可能也是可以的。
- 編輯,也就是去掉相關行注釋之后如下圖:

之后再進行下一步的編譯三步。
配置選項
sudo ./configure --enable-optimizations --prefix=/usr/local/python-3.5.6
--enable-optimizations 為優化性能的選項,建議使用上這個參數。
--prefix為指定安裝的路徑
注:python3.5.6我多次嘗試過了,它己經不認--with-ssl,with-zlib等選項了,我感覺這可能是一種進步,因為我如果漏裝了zlib和readline的話,系統重新安裝上就是了,不用再重新編譯python3也能正確導入了。但注意的是ssl視系統情況不同而不同,openSUSE下ssl的話還是得重新編譯且是在setup.dist中配置。
配置選項
sudo ./configure --enable-optimizations --prefix=/usr/local/python-3.5.6 --with-zlib --with-readline
--enable-optimizations 為最優安裝,建議使用這個參數。
--prefix為指定安裝的路徑
進行編譯安裝
sudo make
sudo make install
修改Python軟鏈
默認python命令是在/usr/bin/目錄下,需要在這里把軟鏈修改成3.5.6的版本,順便建立一個3.5.6的軟鏈。

上圖是原默認軟鏈接,是python2.7的,其實它也己經默認建立了一個python2的軟鏈接了。
重新命名默認python軟鏈接為python2.7以便3.5的版本成為默認環境變量
sudo mv /usr/bin/python /usr/bin/python2.7
建立python3.5版本的軟鏈接
sudo ln -s /usr/local/python-3.5.6/bin/python3.5 /usr/bin/python
當然,也可以不做上一步,而是將3.5版本的軟鏈接成python3之類也是可行的。

比如我做的就是新增python3的軟鏈接指向python3.5所在的目錄。
順便也將配置文件也做了一個軟鏈接指向:
sudo ln -s /usr/local/python-3.5.6/bin/python3.5-config /usr/bin/python3-config
補充
注意 如無特別需要,推薦命名成不同python的軟鏈接,因為你會發覺要是你直接改了原來指向舊版本的軟鏈接的話,pip,virtualenv等依賴原版本python的工具需要改它的py文件頭的環境變量。

如果你修改了原軟鏈接,使得python實際指向的是新版本的python的話,pip等仍依賴舊版本的工具要么重裝要么修改它py文件的首行,按實際情況重新指向你的舊版本原版本的python環境,例如此處我就可直接改成/usr/bin/python2
虛擬環境設置不同版本的python
創建好項目目錄,cd進到目錄下。
在創建python虛擬環境時,可以指定虛擬環境要使用的python版本,例如下命令(使用-p參數指明python解釋器的路徑):
-p PYTHON_EXE, --python=PYTHON_EXE
The Python interpreter to use, e.g.,
--python=python3.5 will use the python3.5 interpreter
to create the new environment. The default is the
interpreter that virtualenv was installed with
(/usr/bin/python)
例:
virtualenv -p /usr/bin/python2 ENV2.7 #創建python2.7的虛擬環境
virtualenv -p /usr/bin/python3 ENV3.5 #創建python3.5的虛擬環境
virtualenv --python=python3 my-env #創建python3.5的虛擬環境
之所以裝多個版本的python,有一個原因很重要,也就是想要使用virtualenv創建隔離的虛擬環境的時候指定不同python版本。但是前面我進行編譯安裝的時候沒有指定編譯安裝上zlib庫,就會出現以下如圖問題:

報找不到zlib模塊錯誤。
所以最好還是系統原環境變量安裝成高版本的python,或進行python編譯安裝的時候記得加上--with-zlib。
最好--with-zlib-devel和readline也帶上。
當然,補救辦法也是有的,就是重新進行編譯安裝。
(重新進行本文最開始的操作,當然本文最開始筆者己經補充更正過了編譯安裝時的配置。)
筆者由於重新編譯后仍然報zlib模塊錯誤,筆者並不想弄污原來python2.7的環境,所以決定嘗試virtualenv下載源碼來使用,而zlib也進行編譯安裝來讓python3也能正常導入zlib模塊。
下載zlib模塊並進行編譯安裝
官網http://www.zlib.net/下載最新版本的zlib源碼文件,我下載的是zlib-1.2.11.tar.gz
安裝zlib:
tar xzvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
建議默認路徑安裝,編譯三部曲:
./configure
make
make install
python導入zlib
如下圖,編譯安裝完成zlib后,進python3測試己經可能正常導入zlib包。

zlib安裝完后,libz.a在/usr/local/lib/,opensuse中zlib.h默認放在/usr/local/include/中。
其它linux的zlib.h文件一般在/usr/include中。
重新編譯python並指定zlib
如果還發生少數導入不成功,或你想直接軟鏈接升級python舊版本的,可能需要重新編譯python。
進入Python源碼文件目錄,重新編譯Python
sudo ./configure --enable-optimizations --prefix=/usr/local/python-3.5.6 --with-zlib=/usr/include
或者:
./configure --enable-optimizations --prefix=/usr/local/python-3.5.6 --with-zlib-dir=/usr/local/lib
都可以完成python對zlib庫的支持,在python源碼中直接import zlib即可使用zlib了。
下載virtualenv源碼包
直接到pypi下載16.0.0版本。
tar命令進行解壓
tar xvfz virtualenv-16.0.0.tar.gz
cd virtualenv-16.0.0
此目錄下文件如下,我們主要用到的並不是setup安裝,而是直接使用它的virtualenv.py文件。

virtualenv創建虛擬環境
在項目目錄下直接指定python版本及virtualenv.py的絕對路徑進行創建虛擬環境:
sudo python3 /home/operation/virtualenv-16.0.0/virtualenv.py py3

可以不進行全局安裝,而是用戶下進行虛擬化環境可以直接使用python3 后接virtualenv.py運行,完美解決需求。
也可以使用原python2下的全局virtualenv來執行,一樣可以創建,如:
operation@opensuse-wordpress:/work> sudo virtualenv --python=python3 my_py3_env
[sudo] password for root:
Running virtualenv with interpreter /usr/bin/python3
Using base prefix '/usr/local/python-3.5.6'
New python executable in /work/my_py3_env/bin/python3
Also creating executable in /work/my_py3_env/bin/python
Please make sure you remove any previous custom paths from your /root/.pydistutils.cfg file.
Installing setuptools, pip, wheel...done.
虛擬隔離環境目錄如下:

具體virtualenv的使用命令等見相關文章,在此就不再詳述。
測試虛擬環境下安裝包
測試進入虛擬環境中安裝django,因為我就試過openSUSE系統openssl和openssl-devel忘裝而導致虛擬環境下python3.5.6版本使用pip安裝時報https連接錯誤的坑。(此坑和解決辦法己補充到前文)
cd /work/py3
source py3/bin/activate
注意:source這個命令不要帶sudo使用才有效,不然會被報找不到source命令。

運行pip install django==1.11之類安裝包的命令,下圖可看到能正常進行安裝。

測試完成,如此,在liunx下己經可以實現多版本的python完美共存。
如此,在liunx下己經可以實現多版本的python完美共存。
2018-8-15 鐵樂與貓
end
