CentOS7 python2升級到python3的那些坑
一)下載原始碼
首先,要說明的是針對python,python.org是官方釋出渠道,其他渠道都是轉載轉存。
其次,python對window/macos有安裝包,但是linux版本需要自己去編譯,意味著需要下載原始碼,然後編譯完成。最新的軟體版在官方網站:這裡有些同學會直接給一個地址,可能看到這個文章的時候版本已經升級了,因此我上面給圖示,讓大家自己去找下載地址。當然也保不齊網站樣式變了,我的圖也不準了。無論如何圖如下,做參考:
最後,可以下載原始碼了:
[XXXXX ~]# python -V
Python 2.7.5
[XXXXX ~]# cd /data/source/
[XXXXX ~]# ls
apache-tomcat-8.5.14-windows-x64.zip libevent-2.0.22-stable.tar.gz pcre-8.33.tar.gz
jdk-8u11-linux-x64.tar.gz memcached-1.4.25.tar.gz redis-3.0.5.tar.gz
jetty-distribution-8.1.9.v20130131.zip nginx-1.3.9.tar.gz zlib-1.2.8.tar.gz
jetty-distribution-9.3.6.v20151106.zip openssl-1.0.1e.tar.gz
[XXXXX source]# wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
--2018-10-01 10:09:20-- https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
Resolving www.python.org (www.python.org)... 151.101.72.223, 2a04:4e42:1a::223
Connecting to www.python.org (www.python.org)|151.101.72.223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22745726 (22M) [application/octet-stream]
Saving to: ‘Python-3.7.0.tgz’
100%[============================================================================>] 22,745,726 86.3KB/s in 2m 47s
2018-10-01 10:12:16 (133 KB/s) - ‘Python-3.7.0.tgz’ saved [22745726/22745726]
二)編譯
tar xzvf Python-3.7.0.tgz
cd Python-3.7.0
mkdir /usr/local/src/python3 #這個是個人喜好放在這個目錄
./configure --prefix=/usr/local/src/python3 --with-ssl #python3 這裡是一個坑,需要安裝ssl的支援
make
make install
這一步可能遇到的問題:
zipimport.ZipImportError: can't decompress data; zlib not available
解決方法:
yum -y install zlib*
vi Modules/Setup
#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz #去掉這個註釋
make install #過程中會進行zlib相關的編譯
這一步還可能遇到的問題:
ModuleNotFoundError: No module named '_ctypes'
解決方案:
yum install libffi-devel -y
make install #過程中會進行ctypes的相關編譯
實際操作中,這個沒有再出錯了。
檢查一下:
ls /usr/local/src/python3/bin
2to3 idle3 pip3.7 python3 python3.7m pyvenv
2to3-3.7 idle3.7 pydoc3 python3.7 python3.7m-config pyvenv-3.7
easy_install-3.7 pip3 pydoc3.7 python3.7-config python3-config
要注意的是產生了:python3和pip3.7
/usr/local/src/python3/bin/python3 -V
Python 3.7.0
/usr/local/src/python3/bin/pip3 -V
pip 10.0.1 from /usr/local/src/python3/lib/python3.7/site-packages/pip (python 3.7)
這都OK了
三)進行連結替換,生效python3.7
檢查系統的python是python2.7的內容
python -V
Python 2.7.5
which python
/bin/python
pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
which pip
/usr/pip
連結替換:
ln -s /usr/local/src/python3/bin/python3 /usr/bin/python -f
ln -s /usr/local/src/python3/bin/pip3 /usr/bin/pip -f
檢查:
[root Python-3.7.0]# python -V
Python 3.7.0
[root Python-3.7.0]# pip -V
pip 10.0.1 from /usr/local/src/python3/lib/python3.7/site-packages/pip (python 3.7)
還需要補充一個easy_install的指向,要知道這個也是有版本區別的,在後續我們使用python3的時候,可能還需要用到,因此就需要進行連結切換:
ln -s /usr/local/src/python3/bin/easy_install /usr/bin/easy_install -f
實際上熟悉linux的同學知道這僅僅就是環境變數的切換,只是上面採用了覆蓋python2的預設檔案來實現這個python/pip/easy_install指向python3
方法很多,例如將/usr/local/src/python3/bin的路徑放在PATH的最前面,等等。結果一樣,就看自己要怎麼使用了。
可以了大功告成????????
四)yum 的影響
yum的指令碼是基於python2.x的,因此,這裡將系統變數進行了python3的修改,那麼就應該對yum的指令碼做python2.x的指定
vim /usr/bin/yum
#!/usr/bin/python2.7
除了yum指令碼以外,還有:
vim /usr/libexec/urlgrabber-ext-down
同樣是進行指定python2.7