Learning Objectives
- 在樹莓派的終端機裡建立資料夾、查看檔案、用 python3 執行程式並用 Ctrl+C 中斷
- 用 apt 更新系統與安裝 python3-xxx 套件
- 說明為什麼直接 pip install 會出現 externally-managed-environment,並改用虛擬環境
- 建立看得到系統套件的虛擬環境(--system-site-packages),在裡面安裝套件、執行程式
在樹莓派上寫程式的工作環境
上一課從筆電 SSH 進了樹莓派。之後每一課的程式都在這個終端機裡建立、執行、除錯, 所以這一課先把工作環境準備好:會管理檔案、會安裝軟體、知道 Python 套件該怎麼裝。
Raspberry Pi OS 以 Debian 為基礎,和 Ubuntu 同屬 Debian 家族,終端機指令幾乎完全相同。 本平台的「Linux(Ubuntu)」軌有完整的指令教學,這一課只挑寫程式最常用的部分。
這一課要回答:
- 怎麼在終端機裡建立資料夾、寫程式、執行程式?
- 系統的軟體用
apt安裝,Python 的套件用pip安裝,兩者有什麼不同? - 為什麼在樹莓派上直接
pip install會被拒絕?虛擬環境是什麼?
操作:終端機、檔案與執行程式
以下的帳號 student、主機名稱 mypi 是範例。提示字元 student@mypi:~ $ 的 ~ 代表目前在家目錄(/home/student)。
-
1
看看自己在哪裡
pwd印出目前的目錄,ls列出裡面的檔案與資料夾。剛裝好的系統,家目錄裡幾乎是空的。 -
2
建立專題資料夾
mkdir -p建立資料夾(-p會順便建立中間的資料夾,已經存在也不會出錯),cd進去。每個專題放在自己的資料夾,之後比較好管理。 -
3
用 nano 寫程式
nano hello.py打開終端機裡的文字編輯器。輸入程式後按 Ctrl+O、Enter 存檔,Ctrl+X 離開。cat可以印出檔案內容確認。也可以在筆電上用支援 SSH 遠端的編輯器(例如 VS Code 的 Remote - SSH 擴充功能)直接編輯樹莓派上的檔案。
-
4
執行程式
用
python3 檔名.py執行。Raspberry Pi OS 內建 Python 3,指令名稱是python3(撰寫時的版本是 Python 3.13)。 -
5
用 Ctrl+C 中斷永遠不結束的程式
控制硬體的程式常常是
while True迴圈或停在pause(),不會自己結束。按 Ctrl+C 送出中斷,Python 會丟出KeyboardInterrupt並停止,回到提示字元。
兩種套件:apt 與 pip
樹莓派上安裝軟體有兩個管道,要分清楚:
| apt | pip | |
|---|---|---|
| 管理什麼 | 整個系統的軟體,包括很多 Python 套件(名稱是 python3-xxx) |
Python 套件(來自 PyPI) |
| 誰維護 | Raspberry Pi OS/Debian | 套件作者 |
| 需要 sudo | 是,安裝到系統 | 在虛擬環境裡不需要 |
| 例子 | sudo apt install python3-gpiozero |
pip install paho-mqtt |
更新系統:先 sudo apt update 下載最新的套件清單,再 sudo apt full-upgrade 升級。官方文件建議用 full-upgrade,
因為 Raspberry Pi OS 的套件相依關係變動得比 Debian 頻繁。gpiozero 在 Raspberry Pi OS 已經內建,不用另外安裝。
為什麼不能直接 pip install:從 Raspberry Pi OS Bookworm 起,在系統的 Python 直接 pip install 會出現 externally-managed-environment 錯誤。
原因是系統本身的工具也用 Python,用 pip 改掉系統裡的套件版本,可能讓 apt 管理的程式壞掉。官方的做法有兩個:
- 套件有
python3-xxx版本時,用sudo apt install python3-xxx安裝到系統。 - 否則建立虛擬環境(virtual environment),在裡面用 pip 安裝。
虛擬環境是一個資料夾,裡面有自己的 Python 與套件,和系統的套件分開;不同專題可以用不同版本的套件,裝壞了刪掉資料夾重來就好。
python3 -m venv --system-site-packages ~/env 建立虛擬環境 env(看得到 gpiozero 等系統套件)
source ~/env/bin/activate 啟用:提示字元前面出現 (env)
pip install 套件名稱 安裝到這個虛擬環境
deactivate 離開虛擬環境
樹莓派上建議加 --system-site-packages:gpiozero 等硬體相關套件是用 apt 裝在系統裡的,加了這個選項,虛擬環境才看得到它們。
操作:更新系統、建立虛擬環境、安裝套件
輸出經過簡化,版本號依安裝當時而定。下一個區塊的模擬器可以自己把這些步驟做一遍。
-
1
更新系統
剛裝好系統、或很久沒用時先更新。
full-upgrade會列出要升級的套件並詢問是否繼續,輸入Y。 -
2
直接 pip install 會被拒絕
錯誤訊息本身就說明了兩個解法:用 apt 安裝 python3-xyz,或建立虛擬環境。
-
3
建立並啟用虛擬環境
在家目錄建立名為
env的虛擬環境,啟用後提示字元前面會出現(env),這時的python、pip都是虛擬環境裡的。 -
4
在虛擬環境裡安裝套件
paho-mqtt是第 16 課會用到的 MQTT 套件。裝在虛擬環境裡,不影響系統。 -
5
離開與下次再用
deactivate離開虛擬環境。之後每次登入要執行用到這些套件的程式,先source ~/env/bin/activate再執行。
在樹莓派上執行第一支硬體程式
環境準備好之後,寫硬體程式的流程就是:
- 在專題資料夾裡用編輯器寫
.py檔 - 需要額外套件時,啟用虛擬環境(或用 apt 安裝
python3-xxx) python3 檔名.py執行;永遠不結束的程式用 Ctrl+C 停止
下面的範例不用接任何零件:gpiozero 的 CPUTemperature 從作業系統讀取 CPU 溫度。真的樹莓派上也可以用 vcgencmd measure_temp 指令看溫度。
模擬器裡的溫度是示意值,會慢慢升高。
逐步看:每秒讀一次 CPU 溫度
注意 f-string 的 {t:.1f}:把溫度格式化成小數一位。每次 sleep(1) 讓時間前進 1 秒,溫度也跟著變;第 4 次超過 50°C,狀態變成「偏高」。
小測驗:終端機與套件
在 Raspberry Pi OS 的系統 Python 直接執行 pip install requests,會出現什麼?
要更新樹莓派上所有系統軟體,官方建議的指令順序是?
執行一個 while True 迴圈的程式,要怎麼讓它停下來回到提示字元?
小測驗:虛擬環境與程式
用 python3 -m venv ~/plain(沒有 --system-site-packages)建立並啟用虛擬環境後,執行 from gpiozero import LED 會怎樣?
下面的程式會印出什麼?
t = 49.96
LIMIT = 50.0
status = "偏高" if t > LIMIT else "正常"
print(f"{t:.1f} °C,{status}")
重點整理
- 終端機常用:
pwd、ls、mkdir -p、cd、cat、nano(Ctrl+O 存檔、Ctrl+X 離開);python3 檔名.py執行,Ctrl+C 中斷。 - 系統軟體用 apt:
sudo apt update再sudo apt full-upgrade;Python 套件有python3-xxx時可以用 apt 安裝。 - 系統的 Python 直接
pip install會出現 externally-managed-environment;改用虛擬環境。 python3 -m venv --system-site-packages ~/env建立、source ~/env/bin/activate啟用、deactivate離開;加了--system-site-packages才看得到 gpiozero 等系統套件。
下一課接上 LED,用 gpiozero 控制第一個零件。