2014-04-17

如何在 Centos 6 下安裝 Python3.4

Centos6 內建的 Python 是 2.6.6 版
如果你將內建的 Python upgrade 成 python 2.7 或以上版本, 那麼你將會遇到毀滅性的災難 (在 Ubuntu 內移除 python 也是相同的情況)
這是因為  Centos 6 的 image 內建工具許多都是使用 Python 2.6 來運作, 一旦沒有 python 2.6, Centos 6 連最基本的 yum 都動不了

以下將教你如何安裝 python 3.4 於 Centos6 而不會覆蓋影響到原來的 python2.6.6. 也就是 python 3.4 和 python 2.6 並存於 Centos6  (雖以 python 3.4 為例, 不過其它 python 版本均同 )

這裡用的小戲法就是使用 "make altinstall 安裝其它版本 Python 在非 /usr/bin 位置, 並且不改變原/usr/bin/python link 指向"


Python 的 make install 跟 make altinstall 有什麼差別呢? 我們看一下 MAKE
install:         altinstall bininstall maninstall

很明顯 install 除了做 altinstall 外還會做 bininstall , maninstall 共三個動作
bininstall 就是在處理 Symbolic Link Chain 的相關事務, 而 maninstall 則是在產生 unversioned manual pages, 所以, 很明顯的, 不使用 bininstall 可以為我們避免 python install 時 update link 的問題


這裡我們打算將其它版本 python 裝到 /usr/local/lib 下
首先我們需要下載一些 compile python 的開發包, 請依以下指令安裝開發包

#yum groupinstall "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


然後下載 python3.4 (其它版本相同, 你可以按你的需求下載不同版本包)
#wget http://python.org/ftp/python/3.4.0/Python-3.4.0.tar.xz
#tar xf Python-3.4.0.tar.xz
#cd Python-3.4.0

下載完後, 我們要做一件事就是開啟 ssl support, 我曾嚐試用  --width-ssl 在 configure 裡, 但它(configure )抱怨說 沒這個選項, 所以我們用以下方法打開 ssl
# cd Modules/
# nano Setup.dist 

按 ctrl+w 尋找 ssl , 修改檔案裡的 SSL, 將它打開, 如以下所示
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        -L$(SSL)/lib -lssl -lcrypto

再回到 Python-3.4.0 目錄下
如果你不打開 ssl 你可能會在後面遇到如下的錯誤訊息:
Download error on https://pypi.python.org/simple/pip/: unknown url type: https -- Some packages may not be found!


 
接下來就是開始 config 並 install, 這裡的 LDFLAGS 的 path 很重要, 因為它決定了你的 python 的安裝位置
然後 make altinstall 就如前文所述, 是避免 link update 原來的舊版 python, 造成 "正常更新"

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


做完以上步驟後, 你應該會在 /usr/local/lib 下發現一個 python3.4 目錄, 我們試一下這個目錄下的 python 版本是多少
#cd  /usr/local/lib/python3.4
#python3.4 -V
Python 3.4.0


如預期的是 Python 3.4.0, 若不是那就表示你那裡做錯囉, 請再重頭來一次. 所以之後, 你要使用 python3.4 請用 python3.4, 而 python 則是原來內建的 python2.6.6
# cd /
# python -V
Python 2.6.6
# python3.4 -V
Python 3.4.0
#
# python3.4
Python 3.4.0 (default, Apr 16 2014, 15:35:31)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>



easy_install 及 pip 是安裝 python module 不可或缺的工作, 接下來就是處理 easy_install 及 pip
首先下載 ez_setup
#wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
 

再來就是將 ez_setup 安裝到我們要的 python3.4 路徑下
#python3.4 ez_setup.py

若是你注意到安裝訊息的倒數第三行你可以發現, 你的 site-packages 是在 /usr/local/lib/python3.4/site-packages/ 即未來你的 module library 是安裝在這個路徑下
Installed /usr/local/lib/python3.4/site-packages/setuptools-3.4.4-py3.4.egg
Processing dependencies for setuptools==3.4.4
Finished processing dependencies for setuptools==3.4.4
#


我們也可以手動使用 site.getsitepackages() 檢查看看是否正常
# python3.4
Python 3.4.0 (default, Apr 16 2014, 15:35:31)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import site; site.getsitepackages()
['/usr/local/lib/python3.4/site-packages', '/usr/local/lib/site-python']
>>>



再來也就是最後一個項目就是安裝 pip => pip, 請使用以下指令
#easy_install-3.4  pip
# pip3.4   -V
pip 1.5.4 from /usr/local/lib/python3.4/site-packages (python 3.4)


安裝完後你會得到一個 pip3.4, 有了 pip3.4 , 你就可以用以下指令安裝/升級/移除 python module
pip3.4 install [packagename]
pip3.4 install --upgrade [packagename]
pip3.4 uninstall [packagename]



到此, 大功告成, 若你不放心, 可以分別檢查一下 python2.6.6 及 python3.4 的所有 library path 是否正確

# python
Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/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']
>>>
[11]+  Stopped                 python


# python3.4
Python 3.4.0 (default, Apr 17 2014, 03:18:32)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys;sys.path
['', '/usr/local/lib/python3.4/site-packages/setuptools-3.4.4-py3.4.egg', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/root/.local/lib/python3.4/site-packages', '/usr/local/lib/python3.4/site-packages']
>>>
 


落落長的一篇文章





參考資料
http://toomuchdata.com/2014/02/16/how-to-install-python-on-centos/

沒有留言:

張貼留言