目錄
    Add a header to begin generating the table of contents

    VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!

    VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!
    Share on facebook
    Share on twitter
    Share on linkedin
    Share on whatsapp
    目錄
      Add a header to begin generating the table of contents

      上一篇我們開始使用 Visual Studio Code 創建 .py 的 Python 編碼檔案,並學會如何在 VS Code 執行 Python 代碼後,我們把焦點轉到一個重要的議題:如何管理專案的 Python libraries?

      如果您不太清楚 Python libraries,可以參考這篇:新手 2/3:如何用 Google Colab 製做互動表格和圖表?快來學 Import library/Jupyter

      為何要管理 Python Libraries?圖書管理員的比喻

      就如我們在虛擬環境(virtual environment)教學提及過,我們每一個 Python 專案應該都有獨立的 Python libraries 和設定。因此,我們必須為每個專案架設獨立的虛擬環境。

      這是避免我們把不兼容的 library 錯誤地匯入不對的專案裡,使我們不但浪費了運算資源,更有機會因為 library 的不兼容,出現難以除蟲(debug)的程式錯誤。

      那麼 pip 在這個前提下是如何發揮作用呢?

      我是廣告 ^o^

      我們可以把虛擬環境想像成書櫃,而 pip 就是圖書管理員。

      每一個 Python 專案有一個獨立的書櫃(虛擬環境),這個書櫃上的書就是每一個 Python library。pip 就是我們的圖書管理員,負責安裝、更新、刪除書櫃上的書(Python library)。

      重要的,是 pip 讓我們可以在不同的書櫃裡(虛擬環境)藏有不同的書籍(Python libraries),使我們安裝 Python libraries 的時候能指名是有哪個虛擬環境,避免誤把其他 Python libraries 安裝到專案。

      使用 pip 的前提和警告

      在我們學習 pip 的功能之前,我們須確保我們已經在 Visual Studio Code 開啟新的虛擬環境(virtual environment)。如您不知道如何開始使用虛擬環境,可以參考這篇:VSCode 2/5: 設定虛擬環境(Virtual Env), 管理 Python 專案!

      如果我們在使用 pip 的時候沒有選擇正確的虛擬環境,有機會會把 Python libraries 安裝至系統的 Python 裡,那麼就更難保持每個虛擬環境的獨立。

      我是廣告 ^o^

      回到 VS Code,首先我們開啟一個新的 Python Terminal。

      您應該見到如下圖般的,在黃色框裡「(.venv)」的字眼,顯示我們已經選用了 vscode-example 裡面的虛擬環境。

      pip 功能 1:安裝新的 library

      在我們使用 pandasplotlyNLTK 等著名的 Python library 輔佐我們編程前,我們先需要安裝新的 Library。安裝的意思就是透過 pip 這個圖書管理員,把這些 library 拷貝到我們的電腦離線使用。

      在 VS Code 的 Python Terminal,使用 pip 安裝新 library 的語法是:

      pip install [library1] [library2] [library3] ...

      如上圖般,您可以直接以空白分割您想安裝的多個 Python libraries,例如上圖就是同時安裝了 pandas 和 plotly。

      我是廣告 ^o^

      以下我們有 2 點有關 pip 的特性,不得不提:

      安裝的 Library 與 Dependencies

      Installing collected packages: six, tenacity, pytz, python-dateutil, numpy, plotly, pandas

      您有沒有發現我們指示 pip 安裝 pandas 與 plotly 時,pip 其實安裝了更多的 library 嗎(如上圖)?

      這些我們沒有要求 pip 安裝,但在「Installing collected package」出現的,就是所謂的 Dependencies。

      一些較為複雜的 Python library 會建基於其他更為簡單的 library,而 pip 在安裝這些複雜的 library 時會同時安裝這些簡單的 library,使您能順利使用您要求的 library。

      因此,我們縱然指示 pip 安裝 2 個 libraries,但實際上 pip 卻安裝了 7 個 library,即是 plotly 和 pandas 有 5 個 library 作它們的 dependencies 。

      我是廣告 ^o^

      安裝指定的 Library 的版本

      Successfully installed numpy-1.21.1 pandas-1.3.1 ...

      另外,在 pip 的成功訊息裡,每一個安裝的 library 或 dependency 都有一串數字跟在後方,例如 numpy-1.21.1。這組數字代表 pip 安裝的 library 版本。

      如果我們指示 pip 安裝時沒有標明所需的版本(例如 pip install pandas),那麼 pip 就會自動安裝最新的版本和 library 作者要求的 dependency 版本。

      但有時我們需要安裝一些舊的 library 版本,例如去兼容舊版的 Python 時,我們可以使用以下的語法:

      pip install [package1]==[version] [package2]==[version]

      雖然這看起來不大用途,但其實對於我們管理 Python 專案的意義深遠。以下我們再作解釋。

      pip 功能 2:freeze、匯入和輸出 library 列表

      使用 pip freeze 輸出 requirements.txt

      當我們安裝了一些我們專案所需的 library 的時候,我們可以使用 pip 輸出已安裝的 library 和版本。

      我是廣告 ^o^

      我們可以在 Python Terminal 輸入以下指令,獲取在這個虛擬環境已經安裝的 Python library:

      pip freeze

      pip freeze 會直接在 Python Terminal 回傳我們已安裝的 library 和版本。

      而更多情況下,我們會使用到以下的代碼,在 root directory (即「vscode-example」)生成一個「requirements.txt」的檔案:

      pip freeze > requirements.txt

      如上圖所見,我們可以見到 requirements.txt 把 pip freeze 的回傳儲存在一個 .txt 的檔案裡。這個 requirements.txt 是一個十分重要的 Python 專案組件,用於:

      用途原因
      備份我們的虛擬環境使用 pip 安裝新的 library 前把現有的 libraries 列表匯出到 requirements.txt,那麼如果新的 library 不兼容於我們的專案,我們可以使用 requirements.txt 還原專案
      部署(deploy)專案把 Python 專案部署到伺服器(例如透過 Google Cloud 等服務)運作時,我們可以使用 requirements.txt 告知伺服器裡的 pip 去安裝所需的 library

      使用 pip install 匯入 requirements.txt

      如果說 pip freeze > requirements.txt 是一個備份(backup)虛擬環境的方法,那麼自然亦會有還原(restore)虛擬環境的方法。

      我是廣告 ^o^

      requirements.txt 就是這麼一個橋樑。我們透過先前匯出的 requirements.txt,可以用於還原所有在該虛擬環境已安裝的 Python library。

      假如我們先在「vscode-example」移除現有的 .venv(詳細教學可以按這裡),並重新架構新的 .venv,那麼我們可以使用以下指令,從 requirements.txt 還原我們的 Python libraries 安裝:

      pip install -r requirements.txt

      在上圖我們首先使用 rm -rf .venvvirtualenv .venv 重置我們的虛擬環境(可以參考這篇的最後部分)。

      橘色的 pip freeze 顯示我們現在的 .venv 時空白的,沒有任何 Python library。

      我們輸入 pip install -r requirements.txt 後,我們成功把圖上方的 requirements.txt 裡的 Python library 安裝到虛擬環境。

      我是廣告 ^o^

      因此,如果我們不小心搞砸了虛擬環境,還是可以使用我們備份的 requirements.txt 還原虛擬環境的初貌。

      pip 功能 3:更新已安裝的 library

      警告 ⚠️:因為更新後的 library 可能出現兼容問題,進行以下操作前,請先使用上面提及的方法使用 requirements.txt 備份虛擬環境的資料。

      Python libraries 的作者會不定時地更新他們的 Library,有機會是修正某些安全漏洞、解決 dependencies 的兼容問題、支援新版的 Python 3.X 等。

      如果我們只想更新一個 library,那麼語法十分簡單:

      pip install --upgrade [package]

      以上我們把 pandas 從 1.2.0 版本升級成 1.3.1。

      留意當我們更新一個 Library 的時候,其實會同時把它的 dependencies 也更新至 Library 最新版的要求。

      我是廣告 ^o^

      (2022/12 更新)同時更新全部已安裝的 Library

      有時我們是一個大懶鬼時,想直接把所有 Library 更新怎麼辦?

      當然,如果是一個小型的專案,那麼應該沒什麼問題,但如果是一個大型的專案(特別是比較多 Python library)就盡量避免同時更新全部 Library,以防出現兼容性的問題。

      參考這裡,我們可以使用以下指令更新全部在我們的虛擬環境裡的 Library:

      pip --disable-pip-version-check list --outdated --format=json | python -c "import json, sys; print('\n'.join([x['name'] for x in json.load(sys.stdin)]))"| xargs -n1 pip install -U

      如果您使用比較舊的 pip 版本(pip 22.3 以下),您亦可以嘗試以下的指令:

      pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

      完成後,所有在您的虛擬環境裡的 Python Library 就會更新至最新版本。

      我是廣告 ^o^

      如果經測試後,這個更新對運行 Python 專案沒有影響,那麼我們便可以使用上面描述的 pip freeze > requirements.txt 刷新我們的虛擬環境設定,讓我們下次 pip install -r requirements.txt 可以安裝新的 Library 。

      pip 功能 4:刪除現有安裝的 Python Library

      如果我們認為一個現有、已安裝的 Python Library 沒有用途,如何從我們的虛擬環境移除?

      移除的方法很簡單,我們只需要

      pip uninstall [library1] [library2] ...

      首先我們必須澄清:這個方法未必是最佳方案(best practice)。由於我們移除單一的 Python library 不會同時移除它的 dependencies,因此如果我們的目的是清理虛擬環境,這個方法並不奏效。

      以上圖為例,我們只指名移除 pandas 時,在橘色框裡 pandas 的 dependencies(numpy、python-dateutil、pytz)沒有同時被移除。

      我是廣告 ^o^

      良好的習慣是在安裝新的 Python library 前,先備份虛擬環境(即 pip freeze > requirements.txt),才安裝 Python library。那麼我們想要移除一些 Library 時,便可以透過上面提及的重設虛擬環境、匯入 requirements.txt 的方法解決我們的問題。

      刪除所有的 Python Library

      最快捷的方法當然是直接刪除 .venv 的檔案夾,重新設定新的 .venv (虛擬環境),那麼您就會有一個新的、空白的虛擬環境可以使用:

      rm -rf .venv
      virtualenv .venv
      pip freeze

      從最後的 pip freeze 輸出為空白可見,我們使用這個方法就可以徹底清除所有已安裝的 Library,重新開始(fresh start)。

      下一步

      我們下一篇,亦是這個系列最後一篇,會講解如何在 VS Code 使用 Jupyter Notebook ,實行更方便的互動編程。

      其他有關 VS Code 的文章:

      我是廣告 ^o^

      人氣文章

      快讓我學更多

      small_c_popup.png
      想學習 Python 嗎?
      快來訂閱我們的電子報!