CentOS-6.5源碼編譯安裝Python2.7.9

筆者序

偶然間翻出一篇去年幫公司安裝開發環境後記下的關於Python安裝的筆記,特來向你們分享。python

猶記得當時Python版本切換的問題困擾了我,以及整個項目組很久,由於按照正常的方法,安裝Python自己沒有問題,且能基本使用,但使用的過程當中出現了大量包引用以及其餘問題,後來發現這一切和本地庫的路徑,以及系統編碼和Python源碼編碼的衝突有關,本文會着重說明。linux

準備工做

  • Python2.7.9源碼包:Python-2.7.9.tgzsql

  • 確保當前系統安裝了gccvim

  • 確保當前系統能夠安裝rpm包。bash

  • 在更新Python版本前,安裝好須要使用的庫(全部要安裝的庫必須兼容新版本,即Python2.7.9),如tkintersqlite等。python2.7

安裝過程

  1. 在終端輸入python進入Python解釋器界面,輸入以下內容:編碼

    import sys
    print sys.maxunicode

    若是結果<=65535,跳過第3步。[1]spa

  2. 解壓縮Python-2.7.9.tgz文件,而後進入Python-2.7.9源碼目錄下。操作系統

  3. 打開configure文件,找到have_ucs4_tcl=no(大概在13047行),將其改成have_ucs4_tcl=yes,保存並退出。[2]code

  4. 在終端執行命令./configure --prefix=/usr/local/,而後執行make && make install編譯安裝。

  5. 在終端執行命令ln -sf /usr/local/bin/python2.7 /usr/bin/python,將系統默認Python版本改成Python2.7.9

  6. 在終端執行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便可。

圖-1 yum沒法使用

其餘庫和模塊

不少時候安裝了新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環境使用本地庫有兩種方法:

  1. 把本地庫的路徑添加到系統環境變量中,執行vim ~/.bashrc編輯環境變量文件,在文件末尾加上export PYTHONPATH=$PYTHONPATH:/usr/lib64/python2.6/lib-dynload/:/Other paths:/…,不一樣路徑用冒號分割,再執行source ~/.bashrc當即在當前終端生效,全局生效須要重啓操做系統。

  2. 把所需的庫複製或移動到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)方法中能夠解決sqlite3import問題,但使用過程當中會出現其餘異常這裏必定要注意

至此,Python升級完成。

後記

由於當時項目條件的緣由,纔有了CentOS-6.5下源碼編譯安裝Python2.7的奇怪需求,實際開發中,建議你們直接使用自帶Python2.7Linux版本,會省去許多麻煩。

固然了,有時候也確實會由於環境升級,項目迭代等緣由須要更新Python版本的,不管哪一個版本,都可參考本文,原理大同小異。

相關文章
相關標籤/搜索