偶然間翻出一篇去年幫公司安裝開發環境後記下的關於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
版本的,不管哪一個版本,都可參考本文,原理大同小異。