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

    VS Code 的 Tasks 提升編程效率?實戰更新所有 pip 的 library

    VS Code 的 Tasks 提升編程效率?實戰更新所有 pip 的 library
    Share on facebook
    Share on twitter
    Share on linkedin
    Share on whatsapp
    目錄
      Add a header to begin generating the table of contents

      在 Python 編程裡,我們許多時會使用 bash terminal (macOS 和 linux)或 command prompt/powershell (Windows OS)去輔佐我們的編程流程。

      而 VS Code 裡面有一個非常實用的功能,可以簡化 bash 或 command prompt 的運作,使我們的編程效率大大提高!

      其他 VS Code 文章:

      導言:使用 bash 輔佐 Python 編程的例子

      在日常的 Python 編程裡,我們有不少使用 bash 輔佐我們的例子:

      • pip 的操作
      • 清理暫存數據(temporary/cache files)
      • 研究日誌文件(log files)

      pip 的操作

      一個最常見的例子便是使用 bash 去安裝 pip 的 Python librarypip 類似是我們的圖書管理員,為我們簡化了許多安裝/更新/移除 Python library 的步驟(詳情可以來看看這篇:VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!)。

      我是廣告 ^o^

      每次使用 pip 的時候,我們皆需要使用 bash 或 command prompt 的指令,例如:

      # 安裝 pandas 與 scikit-learn
      pip install pandas scikit-learn
      
      # 把已安裝的 Python library 例舉成一個新的檔案:
      pip freeze > requirements.txt

      您能否想到其他例子?

      清理暫存文件

      還記得我們之前在介紹 Git 的時候提及的 pycache 檔案嗎?在運行 Python 代碼的時候,我們會生成一些暫存的檔案。

      而有時候,這些檔案可能需要被移除,使我們可以製造新的檔案。

      一些清理暫存的 bash/command prompt 指令可能如下:

      我是廣告 ^o^
      # 移除這個文件夾裡的 __pycache__ 子文件夾
      rm -rf __pycache__

      研究日誌文件

      最後,有時我們的程式可能會輸出一些日誌文件(log files),方便我們除蟲(debug)時可以找到相關資訊,改善我們的編程。

      而通常我們會在 bash 使用 grep 等的工具,讓我們可以篩選(filter)日誌文件裡相關的紀錄:

      # 在 logfile_20230313.txt 裡尋找 "FileScanner" 的紀錄
      grep "FileScanner" logfile_20230313.txt

      使用 VS Code Tasks 簡化我們的流程

      有了以上的例子後,我們可以研究如何簡化以上這些任務,使我們的編程更為順暢!

      如果您還不熟悉如何使用 VS Code,建議您可以瀏覽以下的文章:

      在 VS Code 裡,如果您到 Command Palette (在 macOS 按 Command + Shift + P,在 Windows 按 Control + Shift + P)搜索「Tasks」,您會見到如以下的結果:

      我是廣告 ^o^

      Tasks 在 VS Code 是一個頗有用的功能。正如「Tasks」的中文意思(任務)一樣,這個功能讓您可以在 VS Code 不同的地方運行一些簡單的程序代碼(functional programs)。

      我們應該把 Tasks 想像成一個書籤:透過定義一個新的 VS Code Task,我們把一個編程時需要進行的動作變成了書籤,可以隨時在我們的百寶箱裡拿出來使用。

      以下我們在一個新的專案裡示範如何定義和使用新的 VS Code 的 Task。

      建立一個新的 VS Code Task

      在 VS Code 裡,每一個專案皆有獨立的 Tasks。而 VS Code 會將這些 Tasks 的指令儲存在專案裡的 .vscode/tasks.json 。以下我們介紹如何用 VS Code 自動生成新的 tasks.json,讓我們可以建立新的 Tasks。

      首先我們在 Command Palette 裡按一下「Tasks: Confgure Task」:

      我是廣告 ^o^

      然後,我們滑(scroll)至列表的底部,並按一下「Create tasks.json file from template」:

      之後,我們選擇「Others (Example to run an arbitrary external command)」:

      完成後,我們會發現專案裡多了生成的「.vscode/tasks.json」:

      tasks.json 的結構

       我們一起來看看 VS Code 生成的 tasks.json 結構:

      如圖中所示,這個 tasks.json 的檔案結構其實不太複雜:它就像一個 Python 的字典(dictionary),最主要的部分是「tasks」的子項。

      我是廣告 ^o^

      留意這個子項是一個列表,而這個列表的每一個項目是一個「Task」。如上圖所示,這裡便有 3 個 不同的 Tasks 定義。

      那麼,這個 tasks.json 具體是在哪裡使用的?

      使用 Command Palette 執行 Tasks

      我們可以很方便地在 Command Palette 裡執行自定義的 Tasks。首先我們按 Command + Shift + P(或 Ctrl + Shift + P)開啟 Command Palette,並搜索「Tasks: Run Tasks」:

      然後我們會見到以下的選擇。留意這 3 個 Tasks(echo、echo2、echo3)都是我們剛剛在 tasks.json 裡定義的 Tasks。沒錯,tasks.json 的任何 Tasks 都可以在這裡找到。

      我們按一下「echo」繼續:

      我是廣告 ^o^

      VS Code 會詢問我們對完成 Task 以後的打算。我們先不理這些選項,直接選取「Continue without scanning the task output」:

      這時,您會發現 VS Code 下方 Terminal 的位置運行了些什麼。如下圖所示,這個時候我們會見到「echo – Task」的字眼,並且在 Terminal 裡看見「Executing task: echo Hello」。

      由於我們這個簡單的 task 只是在 Terminal 裡輸出 Hello,所以您見到緊接著 Executing task 有「Hello」的字眼。

      介紹了簡單的操作,我們來看看一些實戰例子吧!

      實戰例子:更新 pip 安裝的 library

      如果您不熟悉 pip 的操作,可以參考這篇教學:VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!

      我是廣告 ^o^

      其中一個我們經常會做的動作便是更新已經安裝的 library。如果您是懶人(如我),可能會選擇同一時間更新所有 pip 的 library,再慢慢研究有甚麼變動。

      之前的教學裡,我們提及以下的 pip 指令讓我們可以同時更新所有的 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

      如果我們可以使用一個 Task 去自動化這個過程,多麼的好?

      Task 的要求

      作為一個謹慎的編程師,我們當然要想想這個 Task 的要求:

      1. 使用我們的虛擬環境(virtual environment)
      2. 備份現在的 pip library 版本:就算我們搞砸了,可以簡單地恢復現狀
      3. 更新所有 pip 的 library

      由於我們的 Task 有數個要求,比較簡單的做法是把我們在 bash 輸入的指令集合成一個單一的 .sh 檔案,再用 VS Code 執行。

      我是廣告 ^o^

      建立 .sh 檔案

      我的個人小習慣是把這些 Tasks 放置在一個名叫「scripts」的文件夾裡。

      如下圖所見,我們在 scripts 的文件夾裡建立一個新的檔案「update_all_pip.sh」,並複製貼上以下 bash 代碼:

      #!/bin/bash
      source .venv/bin/activate
      pip freeze > requirements.txt
      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 freeze

      使 .sh 檔案能被執行

      存檔以後,我們需要把這個 .sh 檔案變成可以執行的檔案(executable)。在 linux 或 macOS 裡我們可以使用以下的指令使這個檔案能被 bash 執行:

      cd scripts
      chmod +x update_all_pip.sh

      定義 VS Code 的 Task

      接下來,我們可以定義我們的 VS Code Task 裡。在 .vscode 的文件夾裡我們開啟 tasks.json,並加入以下的 tasks:

              {
                  "label": "Update all pip libraries",
                  "type": "shell",
                  "command": "./scripts/update_all_pip.sh"
              }

      留意這個 command 就是運行我們剛剛定義的 update_all_pip.sh 檔案。

      我是廣告 ^o^

      運行定義的 Task

      接下來,我們終於可以使用這個新定義的 Task 了!同樣地我們在 Command Palette 選擇 Tasks: Run Task:

      然後我們選取「Update all pip libraries」:

      再選取「Continue without scanning the task output」:

      這次,我們在自動彈出的 Terminal 裡終於見到「Update all pip libraries – Task」在執行:

      給予 Terminal 一點時間後,我們終於可以見到以下的提示,表示我們的 pip 更新完成。如果我們對比 requirements.txt (在 Task 一開始我們有自動備份了),會見到 pandas 從 1.4.0 更新至 1.5.3,以及其他 library 的不同版本。

      我是廣告 ^o^

      下次重啟 VS Code 的時候,我們又可以再運行一遍這個 Task,讓我們的 pip libraries 保持在最新狀態。

      結語

      希望您透過以上對 VS Code Tasks 的介紹,學會了如何透過 Tasks 自動化一些編程的任務吧!如果您有其他的例子,不妨告訴我們吧!

      其他 VS Code 文章:

      人氣文章

      快讓我學更多

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