1. 程式人生 > >在centos6.5環境下搭建多版本python(python2.6、python2.7、python3.5)共存環境

在centos6.5環境下搭建多版本python(python2.6、python2.7、python3.5)共存環境

可能存在的問題

  1. yum安裝、原始碼安裝、二進位制安裝用哪個,官網文件是原始碼安裝,所以咱們就用原始碼安裝
  2. 在原始碼安裝的時候會有什麼問題
    • 一個是預設路徑的問題,在編譯的時候時候如果不指定路徑的話,很多二進位制檔案會安裝到預設的目錄下/usr/bin下面,系統原來的檔案可能還會有,但是各種連結會指向新的二進位制檔案,這樣有可能會造成系統內某些依賴原來版本python的服務依會出現問題,一個已知的是yum會出現問題。那麼解決的方法就是在configure的時候制定一個不一樣的路徑,可以是/usr/local(這樣pyhon的各個檔案會散落在/usr/local的各個目錄裡面),可以是/usr/local/python3(這樣python所有的檔案都會集中到/usr/local/python3裡面),當然也可以是任何你喜歡的地方比如(/home/user/Software/python3),放在哪裡我覺得都可以,參考文件是放到/usr/local裡面這樣的好處是,預設的path路徑裡面就包含/usr/local,那麼當你安裝好之後,直接就可以呼叫命令而不用再修改PATH。其實我偏向於用/usr/local/python3。
    • make altinstall的問題,如果用make install,在安裝完新版本的python之後,新舊兩個版本的python可執行檔案(python2 python3)都會被連結到python這個可執行檔案上,這會出現一些問題。如果用make altinstall,在安裝完之後,不會建立軟連結。
  3. Unicode
    python經歷了一個漫長和複雜的歷史過程才支援了unicode,所以如果你沒有別的什麼特殊需求的話,在安裝2.7的時候請務必新增UTF-32支援,雖然會增加記憶體的使用但是增加了相容性。python3.3以上不存在這個問題。在configure的時候加上這句–enable-unicode=ucs4
  4. 動態庫(shared library)
    現代所有的linux發行版都把python程式設計成共享庫,有些第三方的工具像mod_wsgi或者Blender都是依賴於這個共享庫的,所以在安裝新版本的python的時候最好能把這個編譯成共享庫。在configure的時候加上LDFLAGS=”-Wl,-rpath /usr/local/lib”

前置安裝

yum -y update
yum groupinstall 'Development Tools'
yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel
readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel

常規安裝

Pyhon2.7

wget http://python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz
tar xf Python-2.7.13.tar.xz
cd Python-2.7.13
./configure --prefix=/usr/local/python27 --enable-unicode=ucs4 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstal

Python3.6

wget http://mirrors.sohu.com/python/3.6.0/Python-3.6.0.tar.xz(國內sohu源)
wget http://python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
tar xf Python-3.6.0.tar.xz
cd Python-3.6.0
./configure --prefix=/usr/local/python3 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall

刪除動態庫中的符號以節省記憶體空間

strip /usr/local/lib/libpython2.7.so.1.0
strip /usr/local/lib/libpython3.6m.so.1.0

安裝pip,包管理

# First get the script:
wget https://bootstrap.pypa.io/get-pip.py

# Then execute it using Python 2.7 and/or Python 3.6:
python2.7 get-pip.py
python3.6 get-pip.py

# With pip installed you can now do things like this:
pip2.7 install [packagename]
pip2.7 install --upgrade [packagename]
pip2.7 uninstall [packagename]

環境共存問題

利用virtualenv來解決多版本python共存的問題。virtualenv是python的一個包,在2.7下面需要用pip安裝,在3.3以上已經內建在python裡面了,不用在單獨安裝。我理解它的使用是這樣的:
* 如果你想建立2.7版本下的隔離環境,你就需要用2.7版本下的vritualenv包的命令,如果你想建立3.6版本下的隔離環境就需要用3.6下的virtualenv包的命令。不同版本的virtualenv命令是不一樣的。
* 排除版本不同的命令,virtual使用的大概框架是類似的
+ 首先建立一個虛擬環境,這個虛擬環境其實就是一個目錄,這個目錄裡面是這個虛擬環境的配置檔案,配置檔案包括啟動與結束這個虛擬環境的指令碼以及庫檔案。你看這些目錄其實就是那些那麼版本檔案的軟連結嘛,比如2.7的虛擬環境,bin目錄下基本上是2.7所有的那些二進位制檔案都連結過來。
+ 利用目錄裡面的啟動指令碼來啟動虛擬環境,啟動後在提示符前面會有一個這個虛擬環境的識別符號。只要有這個識別符號就說明在這個虛擬環境中了,你就可以自由的用python,pip這些命令再也不用擔心出錯了。
+ 利用目錄裡的結束指令碼來結束虛擬環境。
其實看完這個目錄樹你就知道其實這是利用bash環境指令碼等工具做出的一個子程序環境,其實自己做也行了。但是人家已經寫好了就不要重新發明輪子,自己寫還容易出錯呢。

# Install virtualenv for Python 2.7 and create a sandbox called my27project:
pip2.7 install virtualenv
virtualenv my27project

# Use the built-in functionality in Python 3.6 to create a sandbox called my36project:
python3.6 -m venv my36project

# Check the system Python interpreter version:
python --version
# This will show Python 2.6.6

# Activate the my27project sandbox and check the version of the default Python interpreter in it:
source my27project/bin/activate
python --version
# This will show Python 2.7.13
deactivate

# Activate the my36project sandbox and check the version of the default Python interpreter in it:
source my36project/bin/activate
python --version
# This will show Python 3.6.0
deactivate

參考文件