前言
在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主機
建置步驟
先安裝一些編譯的時需要用到的套件
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
接著,切換目錄並下載想要手動編譯安裝的版本,下載完成後進行解壓縮。
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環境。
cd Python-3.5.6 sudo ./configure --enable-optimizations sudo make altinstall
接著執行下列的指令,就代表安裝Python完成了。
python3.5 -V
編譯遇到問題
在編譯更之前的Python版本,比如3.5.2版本,在編譯過程中,可能會遇到類似這樣的錯誤。
有這錯誤代表說,SSL擴展無法編譯甚至失敗,最有可能原因是libssl-dev套件關係。
而在Ubuntu 18.04中,libssl-dev套件版本為1.1,在編譯與安裝較舊Python版本可能不適合,為了要解決這個問題,需要將Ubuntu 18.04降版本以便讓Python版本能夠成功的編譯。
而我們可以用下列的方式將libssl-dev套件進行降版本。
sudo apt-get install libssl1.0-dev
將libssl-dev版本改為1.0之後,Python 3.5.2便可以編譯成功了。
移除已編譯後的Python安裝檔
當我們不需要使用已經安裝好的Python執行檔,我們則需要手動刪除安裝到各個目錄下的Python版本。以下是已經整理好要刪除的所有目錄位置。
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版本。
參考資料