前言
在Ubuntu 18.04中,Python3預設的版本為3.6,但是有的時候想測試的時候要用3.5版本怎辦?
這個時候,就會有兩種方式:
- 自己手動編譯一個Python 3.5版本在系統上。
- 使用pyenv等Python多版本工具管理Python。
第1種方法,優點是快速但是需要小心不要污染到系統本來的Python設定。
缺點則是在刪除的時候變得較為麻煩,需要手動刪除安裝上去的Python相關資料夾。
第2種方法,優點則是操作起來較為方便且不容易污染到系統Python版本設定。
缺點是建置步驟較為繁雜,多了好幾個步驟。
在本文章中,為展示第1種方法,其目的是紀錄我採過雷的心得與第2種方法做為一個比較。
當然,在下一篇文章中,會針對第2種方法來建置與管理多個Python版本之工具。
前置環境
- 需要一個Ubuntu 18.04主機
建置步驟
先安裝一些編譯的時需要用到的套件
1 2 3 4 5 | sudo apt-get update sudo apt-get install build-essential checkinstall sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev |
接著,切換目錄並下載想要手動編譯安裝的版本,下載完成後進行解壓縮。
1 2 3 4 5 | cd /usr/src wget https: //www .python.org /ftp/python/3 .5.6 /Python-3 .5.6.tgz sudo tar xzf Python-3.5.6.tgz |
切換到下載回來的Python原始碼目錄並進行檢查編譯環境與安裝在系統上。
使用make altinstall是因為避免污染到系統上的Python環境。
1 2 3 4 5 | cd Python-3.5.6 sudo . /configure -- enable -optimizations sudo make altinstall |
接著執行下列的指令,就代表安裝Python完成了。
1 | python3.5 -V |
編譯遇到問題
在編譯更之前的Python版本,比如3.5.2版本,在編譯過程中,可能會遇到類似這樣的錯誤。
有這錯誤代表說,SSL擴展無法編譯甚至失敗,最有可能原因是libssl-dev套件關係。
而在Ubuntu 18.04中,libssl-dev套件版本為1.1,在編譯與安裝較舊Python版本可能不適合,為了要解決這個問題,需要將Ubuntu 18.04降版本以便讓Python版本能夠成功的編譯。
而我們可以用下列的方式將libssl-dev套件進行降版本。
1 | sudo apt-get install libssl1.0-dev |
將libssl-dev版本改為1.0之後,Python 3.5.2便可以編譯成功了。
移除已編譯後的Python安裝檔
當我們不需要使用已經安裝好的Python執行檔,我們則需要手動刪除安裝到各個目錄下的Python版本。以下是已經整理好要刪除的所有目錄位置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | prefix= '/usr/local/' pyver= '3.5.6' rm -rf \ ${prefix}bin /python ${pyver} \ ${prefix}bin /pip ${pyver} \ ${prefix}bin /pydoc \ ${prefix}bin /include/python ${pyver} \ ${prefix}lib /libpython ${pyver}.a \ ${prefix}lib /python ${pyver} \ ${prefix}bin /python ${pyver} \ ${prefix}bin /pip ${pyver} \ ${prefix}bin /include/python ${pyver} \ ${prefix}lib /libpython ${pyver}.a \ ${prefix}lib /python ${pyver} \ ${prefix}lib /pkgconfig/python- ${pyver}.pc \ ${prefix}lib /libpython ${pyver}m.a \ ${prefix}bin /python ${pyver}m \ ${prefix}bin /2to3- ${pyver} \ ${prefix}bin /python ${pyver}m-config \ ${prefix}bin /idle ${pyver} \ ${prefix}bin /pydoc ${pyver} \ ${prefix}bin /pyvenv- ${pyver} \ ${prefix}share /man/man1/python ${pyver}.1 \ ${prefix}include /python ${pyver}m ${prefix}bin /pydoc ## WARN: skip if other pythons in local exist. |
其中,pyver變數我們可以自行更改成我們需要移除的Python版本。
參考資料