in Ubuntu/Debian

如何在Ubuntu 18.04上手動編譯Python 3.5版本

前言

在Ubuntu 18.04中,Python3預設的版本為3.6,但是有的時候想測試的時候要用3.5版本怎辦?

這個時候,就會有兩種方式:

  1. 自己手動編譯一個Python 3.5版本在系統上。
  2. 使用pyenv等Python多版本工具管理Python。

第1種方法,優點是快速但是需要小心不要污染到系統本來的Python設定。

缺點則是在刪除的時候變得較為麻煩,需要手動刪除安裝上去的Python相關資料夾。

第2種方法,優點則是操作起來較為方便且不容易污染到系統Python版本設定。

缺點是建置步驟較為繁雜,多了好幾個步驟。

在本文章中,為展示第1種方法,其目的是紀錄我採過雷的心得與第2種方法做為一個比較。

當然,在下一篇文章中,會針對第2種方法來建置與管理多個Python版本之工具。

前置環境

  1. 需要一個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版本。

參考資料