在 Python 編程裡,我們許多時會使用 bash terminal (macOS 和 linux)或 command prompt/powershell (Windows OS)去輔佐我們的編程流程。
而 VS Code 裡面有一個非常實用的功能,可以簡化 bash 或 command prompt 的運作,使我們的編程效率大大提高!
其他 VS Code 文章:
- VSCode 1/5: macOS 最佳 Python 編程工具?豐富的插件商店?Visual Studio Code 安裝攻略
- VSCode 2/5: 設定虛擬環境 Virtual Env,管理 Python 專案!
- VSCode 3/5: 實戰篇!版面介紹、管理 Python 專案和多個 .py
- VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!
- VSCode 5/5: Jupyter Notebook 互動編程?實在太方便了
- Git 1/4: 甚麼是 Git/Github?為什麼需要專案版本管理?
導言:使用 bash 輔佐 Python 編程的例子
在日常的 Python 編程裡,我們有不少使用 bash 輔佐我們的例子:
- pip 的操作
- 清理暫存數據(temporary/cache files)
- 研究日誌文件(log files)
pip 的操作
一個最常見的例子便是使用 bash 去安裝 pip 的 Python library。pip 類似是我們的圖書管理員,為我們簡化了許多安裝/更新/移除 Python library 的步驟(詳情可以來看看這篇:VSCode 4/5: 讓 pip 安裝和管理 Python Libraries,結合虛擬環境!)。
每次使用 pip 的時候,我們皆需要使用 bash 或 command prompt 的指令,例如:
# 安裝 pandas 與 scikit-learn pip install pandas scikit-learn # 把已安裝的 Python library 例舉成一個新的檔案: pip freeze > requirements.txt
您能否想到其他例子?
清理暫存文件
還記得我們之前在介紹 Git 的時候提及的 pycache 檔案嗎?在運行 Python 代碼的時候,我們會生成一些暫存的檔案。
而有時候,這些檔案可能需要被移除,使我們可以製造新的檔案。
一些清理暫存的 bash/command prompt 指令可能如下:
# 移除這個文件夾裡的 __pycache__ 子文件夾 rm -rf __pycache__
研究日誌文件
最後,有時我們的程式可能會輸出一些日誌文件(log files),方便我們除蟲(debug)時可以找到相關資訊,改善我們的編程。
而通常我們會在 bash 使用 grep 等的工具,讓我們可以篩選(filter)日誌文件裡相關的紀錄:
# 在 logfile_20230313.txt 裡尋找 "FileScanner" 的紀錄 grep "FileScanner" logfile_20230313.txt
使用 VS Code Tasks 簡化我們的流程
有了以上的例子後,我們可以研究如何簡化以上這些任務,使我們的編程更為順暢!
如果您還不熟悉如何使用 VS Code,建議您可以瀏覽以下的文章:
- VSCode 1/5: macOS 最佳 Python 編程工具?豐富的插件商店?Visual Studio Code 安裝攻略
- VSCode 2/5: 設定虛擬環境 Virtual Env,管理 Python 專案!
在 VS Code 裡,如果您到 Command Palette (在 macOS 按 Command + Shift + P,在 Windows 按 Control + Shift + P)搜索「Tasks」,您會見到如以下的結果:
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」:
然後,我們滑(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」的子項。
留意這個子項是一個列表,而這個列表的每一個項目是一個「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」繼續:
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,結合虛擬環境!
其中一個我們經常會做的動作便是更新已經安裝的 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 的要求:
- 使用我們的虛擬環境(virtual environment)
- 備份現在的 pip library 版本:就算我們搞砸了,可以簡單地恢復現狀
- 更新所有 pip 的 library
由於我們的 Task 有數個要求,比較簡單的做法是把我們在 bash 輸入的指令集合成一個單一的 .sh 檔案,再用 VS Code 執行。
建立 .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 檔案。
運行定義的 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 的不同版本。
下次重啟 VS Code 的時候,我們又可以再運行一遍這個 Task,讓我們的 pip libraries 保持在最新狀態。
結語
希望您透過以上對 VS Code Tasks 的介紹,學會了如何透過 Tasks 自動化一些編程的任務吧!如果您有其他的例子,不妨告訴我們吧!
其他 VS Code 文章: