linux 下從源碼安裝 Python——小白踩坑記


實驗室服務器使用的系統為 Ubuntu 16.04,自帶的 python 版本為 Python 2.7.12 和 Python 3.5.2,命令行下使用$ python命令來啟動 python 時默認是 python2.7。而我想使用 Python 3.8,因此嘗試從源碼安裝 Python,並更改默認的$ python命令指向。

注:如果想要安裝某個非系統自帶的 Python 版本,切忌沖動刪除系統自帶的 Python 2.7 和 Python 3.5,某些系統應用可能依賴於這些 Python 環境的調用,防止系統出錯!

1. 官網下載 python 源碼

在官網這里下載你想要的 linux 環境下的 python 源碼,如我下載的是下圖第一個 Gzipped source tarball,其實二選一就好。

python源碼.png

我下載完成后是一個叫 Python-3.8.3.tgz 的文件,在下載目錄里使用tar -xvf Python-3.8.3.tgz 命令解壓文件包,目錄里多出一個 Python-3.8.3 的文件夾,cd 命令進入該文件夾。

上述操作總結起來如下:

wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar -xvf Python-3.8.3.tgz
cd Python-3.8.3

2. 安裝依賴

Python 源碼編譯、安裝過程中需要用到一些工具,你的系統里可能有、可能沒有這些工具,保險起見,使下以下命令先把這些依賴安裝好吧。

這一步其實可以放在最開始執行。

  1. Ubuntu/Debian 系列:
    sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl
    
  2. Fedora/CentOS/RHEL 等可參考:
    sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel
    

3. 編譯並安裝 python

注意根據第 1 節最后的 cd 命令,我們現在是在 python 的源碼文件夾里進行操作。

3.1 指定 python 的安裝目錄

作為 CS 小白,我還是要區別一下 python 的“源碼目錄”和“安裝目錄”兩個概念的,畢竟是第一次在 linux 下從源碼安裝軟件。

要知道,當前我們所在的目錄Python-3.8.3是由最開始下載的源碼壓縮包解壓出來的,因此這個目錄里是 python 這個軟件開源的源碼,故稱之為源碼目錄;而安裝目錄是說我們這個 python 軟件要安裝在系統的哪個地方,你啟動 python 的時候實際是從這里啟動的。

類比下 windows 的話就是:源碼目錄是你下載的那個安裝程序xxx.exe所在的目錄,還記得一些大型軟件(如 office 2016)安裝的時候通常是一個文件夾里有一個setup.exe的程序嗎(當然,很多軟件你下載下來的安裝包其實就一個單獨的.exe 可執行文件就沒了),windows 下就是直接點擊這個xxx.exe進行安裝的,這就是所謂的源碼目錄;那么顯而易見,安裝目錄就是你在運行xxx.exe進行安裝的時候選擇的安裝地址,譬如說經常是C:\Program Files\等等。真正的軟件組件肯定是在安裝目錄里,軟件需要從這里啟動,而你平常習慣的在 windows 桌面/開始菜單里點擊的圖標就是從安裝目錄里延伸出的快捷方式。

回歸主題,我選擇的 python 安裝目錄是/opt/python3.8,因此通過如下命令先建立這個文件夾:

mkdir /opt/python3.8

3.2 執行./configure

python 源碼目錄里有一個 configure 可執行文件,這個命令的作用是生成一個 MakeFile 文件,此 Makefile 文件用來被之后的 make 命令所使用進行源碼編譯(Linux 需要按照 Makefile 所指定的順序來編譯 (build) 程序組件)。

configure 通常有一些參數選項,最常見的是--prefix,用來指定安裝目錄。此外,要注意的是,python3.4 以后自帶了 pip,為了在之后能夠成功使用這個 pip 進行 python 庫的安裝,最好加上--with-ssl 參數。--with-ssl 這個參數不加的話 python 的安裝過程不受影響,只是當你想要用 pip 安裝 python 庫的時候會報錯,發現它無法連接到 pypi,跟 pip 連不上網沒啥區別。

總之,使用如下命令:

./configure --with-ssl --prefix=/opt/python3.8

3.3 make 編譯

make命令實際就是編譯源代碼,其根據 Makefile 文件執行編譯指令並生成可執行文件。

make

3.4 使用 make install 進行安裝

當 make 的源代碼編譯無誤,使用make install就是進行軟件的安裝,似乎也要根據 Makefile 文件以及根據 make 生成的可執行文件進行執行,原理尚不明確,現在確定的是其現實意義是把軟件安裝到configure命令指定的目錄,對我而言就是/opt/python3.8

make install因為是軟件安裝,因此通常需要 sudo 權限。

sudo make install

4. 配置環境

至此 python 的安裝過程其實已經完成,在安裝目錄里使用./bin/python3即可打開安裝好的 python 可執行文件並進入 python 命令行了:

啟動python.png

但是每次要從安裝目錄里啟動 python 很不方便,我們想要達到的是在 shell 中隨時隨地喚醒這個 python,這便需要進行相關的環境配置。

4.1 刪除原有的軟鏈接

開頭的時候提到,我的系統中默認的 python 命令打開的是系統自帶的 python2.7,現在要更改這個命令讓它打開的是新安裝的 python3.8,這需要我們先理解命令行(shell)中的命令是怎么執行的:

  • 在 shell 中,執行的所有命令如 cd、ls、ps、python 等,分為“內建命令”和“外部命令”。內建命令是 shell 自帶的命令,好比編程語言不需要使用函數庫而自帶的那些函數,如print()函數;外部命令是為了豐富 shell 的功能而自己安裝的一些命令,好比你編程時使用的第三方庫,當然,有些外部命令是你安裝 linux 系統時就已經自帶的命令,好比編程語言的標准庫,雖然是“自帶的”但依然是“外部命令”。
  • python 毫無疑問是外部命令,那么外部命令是怎么執行呢?這就要提到平常經常見到的PATH概念了。當 shell 中輸入一個命令時,shell 首先檢驗它是不是內建命令,當內建命令中找不到這條命令時,shell 就搜索你的PATH,這個東西就是一個存儲了你的外部命令所在路徑的集合,shell 在這些路徑中尋找你輸入的命令對應的那個可執行文件,找得到就在 shell 中執行,找不到就報錯。
  • 於是,shell 中 python 命令的執行過程為:在PATH存儲的那么路徑里(包含很多路徑,其中一個是/usr/bin/)尋找一個名為python的可執行文件,一般情況下,有這么一個文件:/usr/bin/python,找到它以后執行,就打開了 python。

現在我們使用ls -l /usr/bin/python查看這個文件的詳細信息,發現它是一個執行 python2.7 的軟鏈接(相當於 windows 里的快捷方式),把它刪掉,這樣在 shell 中直接輸入 python 就再也打不開任何 python 環境了,它成了一個無效命令。

總結一下,這步操作的命令過程為:

ls -l /usr/bin/python
sudo rm /usr/bin/python

4.2 建立新的軟鏈接

使用軟鏈接創建命令ln -s把新安裝的 python 鏈接到上步刪除的舊的軟鏈接所在目錄即可。即:

ln -s /opt/python3.8/bin/python3 /usr/bin/python

此時在任意工作目錄的 shell 中任意輸入 python,即可打開新安裝的 python 3.8 了。

chuan@workstation:~$ python
Python 3.8.3 (default, Jun 21 2020, 16:34:59)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

4.3 配置 pip 命令

你的系統可能也自帶了 pip 或 pip2、pip3 等命令,由於自帶的 pip 關聯的肯定是原有的 python 環境,此時盲目使用 pip install 一些庫的話,這些庫其實被安裝到了系統自帶的 python 環境里了,在你新安裝的 python3.8 里根本無法導入這些庫,這就尷尬了。

這個 pip 其實和之前被刪除的 python 軟鏈接一樣,是一個在相同目錄下的 pip 軟鏈接,和更改 python 命令一樣,刪除掉原來的 pip 被建立一個新的 pip 軟鏈接即可。為了讓 pip 關聯的是新下載的 python3.8,新的 pip 應該來自 python3.8 自帶的那個 pip,其路徑為./opt/python3.8/bin/pip3。話不多說,代碼如下:

sudo rm /usr/bin/pip
ln -s /opt/python3.8/bin/pip3 /usr/bin/pip

5. 前方告捷,嘿嘿

6. 附記

新安裝的 pip 在安裝第三方庫時還是有一個小小的報錯,提示什么文件夾權限不明確/不足以及:

Could not install packages due to an EnvironmentError: [Errno 13] Permission denied

根據百度,出現這個報錯之后,在 pip install 之后加個--user 可解決,如下:

pip install --user numpy

第一次加過--user 之后便不再有報錯,但不明所以的是這樣之后 pip 安裝的第三方庫的目錄被定在了~/.local/,原來似乎不存在這個文件夾。不過這並沒有造成后續什么問題,暫且不管了,挖個坑后續再研究。

另外,不知道能不能選擇直接把一個已安裝的 pip 綁定到指定的 python 環境,而不用這么折騰,未完待續吧......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM