前面五章,我們已經完成:
Raspberry Pi 是什麼
↓
Raspberry Pi 5 硬體
↓
Raspberry Pi OS
↓
Linux Terminal
↓
Network / SSH
現在 Raspberry Pi 已經是一台可以:
- 開機
- 執行 Linux
- 使用 Terminal
- 連接網路
- SSH 遠端登入
的完整 Linux 電腦。
接下來,我們終於要開始讓 Raspberry Pi:
執行自己寫的程式。
這套課程主要選擇:
Python 3
作為 Raspberry Pi 應用程式的主要開發語言。
Python 官方將 Python 定位為容易學習、功能強大,並具有高階資料結構與清楚語法的程式語言;官方 Tutorial 也涵蓋控制流程、資料結構、模組、輸入輸出與例外處理等核心概念。
後面我們會逐步把 Python 和:
GPIO
Sensor
I²C
SPI
UART
Camera
Flask
MQTT
SQLite
整合。
所以本章不是單純學 Python 語法。
真正目的是建立:
後續 Raspberry Pi 硬體與 IoT 程式設計的基礎。
1. Python 是什麼?
Python 是一種高階程式語言。
它的一個重要特色是:
程式碼通常相對容易閱讀。
例如最簡單的輸出:
print("Hello Raspberry Pi")
就可以讓電腦顯示:
Hello Raspberry Pi
不像某些語言需要先寫較多程式結構才能輸出第一行文字。
因此 Python 很適合拿來學:
- Programming
- Automation
- Data Processing
- Web
- IoT
- AI
- Raspberry Pi
2. 為什麼 Raspberry Pi 很適合 Python?
因為 Raspberry Pi 是完整 Linux 電腦。
所以 Python 不只能:
計算數學
還可以進一步控制:
Python
│
├── File
├── Network
├── Database
├── GPIO
├── Sensor
├── Camera
├── MQTT
└── Web Server
這也是 Raspberry Pi 和一般只有 MCU 的開發板很不同的地方。
3. Python 和 Arduino C/C++ 有什麼差異?
如果使用 Arduino UNO,常見程式:
void setup()
{
}
void loop()
{
}
Arduino 程式通常經過:
Source Code
↓
Compile
↓
Upload
↓
Microcontroller
Raspberry Pi Python 的典型流程則是:
Python Source
↓
Python Interpreter
↓
Linux
↓
執行程式
所以在 Raspberry Pi 上,我們通常不需要像 Arduino IDE 那樣每次:
Compile
+
Upload
才能執行。
可以直接:
python3 program.py
4. Python 2 和 Python 3 不一樣
如果搜尋很舊的 Raspberry Pi 教學,可能看到:
python
甚至 Python 2 語法。
目前新開發應該使用:
Python 3
因此本系列統一使用:
python3
例如:
python3 hello.py
避免把不同世代的 Python 教學混在一起。
5. 先確認 Raspberry Pi 的 Python
打開 Terminal:
python3 --version
會顯示目前安裝的 Python 3 版本,例如:
Python 3.x.x
實際小版本會依 Raspberry Pi OS 映像與後續系統更新而有所不同,因此教學程式不應依賴不必要的固定小版本號。
6. 找出 python3 在哪裡
輸入:
which python3
通常可以看到:
/usr/bin/python3
這代表:
python3
這個 Command 目前對應的 Interpreter 在哪裡。
後面進入 Virtual Environment 後再次執行:
which python
你會發現路徑發生變化。
這是一個非常重要的觀念。
7. Python 有兩種基本使用方式
Python 初學可以先分成:
Python
│
├── Interactive Mode
│
└── Script File
Interactive Mode 適合:
- 測試
- 練習
- 快速計算
Script File 適合:
- 正式程式
- GPIO
- Sensor
- Project
- 長期保存
8. 進入 Python Interactive Mode
Terminal 輸入:
python3
會看到類似:
Python 3.x.x ...
>>>
其中:
>>>
就是 Python Interactive Prompt。
現在可以直接輸入:
print("Hello Raspberry Pi")
結果:
Hello Raspberry Pi
9. Interactive Mode 可以拿來當計算機
例如:
1 + 2
得到:
3
或者:
10 * 5
得到:
50
再例如:
100 / 4
得到:
25.0
非常適合測試簡單 Python Expression。
10. 如何離開 Python Interactive Mode?
輸入:
exit()
或者:
Ctrl + D
就可以返回 Linux Shell。
例如:
>>>
變回:
jason@rpi5-lab:~ $
代表已經回到 Linux。
11. 第一支正式 Python 程式
現在建立一個專門放課程程式的 Directory。
cd ~
建立:
mkdir -p raspberrypi-course/chapter06
進入:
cd raspberrypi-course/chapter06
確認:
pwd
應該類似:
/home/jason/raspberrypi-course/chapter06
12. Python 程式副檔名
Python Source Code 通常使用:
.py
例如:
hello.py
temperature.py
gpio_led.py
mqtt_client.py
camera.py
因此我們第一支程式建立:
hello.py
13. 使用 nano 建立 hello.py
輸入:
nano hello.py
寫入:
print("Hello Raspberry Pi")
儲存:
Ctrl + O
離開:
Ctrl + X
14. 查看程式內容
可以:
cat hello.py
應該看到:
print("Hello Raspberry Pi")
這代表:
hello.py
已經正式存在 Linux File System。
15. 執行第一支 Python 程式
輸入:
python3 hello.py
結果:
Hello Raspberry Pi
恭喜。
現在已經完成:
Source Code
↓
Python Interpreter
↓
Program Output
這就是後面所有 Raspberry Pi Python 程式的基本流程。
16. Python 程式可以有很多行
修改:
nano hello.py
變成:
print("Hello Raspberry Pi")
print("Raspberry Pi OS")
print("Python 3")
print("GPIO")
print("IoT")
執行:
python3 hello.py
輸出:
Hello Raspberry Pi
Raspberry Pi OS
Python 3
GPIO
IoT
Python 會依程式流程逐行執行。
17. Comment 註解
Python 單行 Comment 使用:
#
例如:
# Raspberry Pi Python test
print("Hello Raspberry Pi")
# 後面的內容不會當成一般程式 Statement 執行。
Comment 可以說明:
- 這段程式做什麼
- Pin 用途
- Sensor
- 設定值
- 修改原因
18. 好的 Comment 應該說明「為什麼」
例如:
# 每 2 秒讀一次感測器,避免過度頻繁更新
interval = 2
通常比:
# interval 等於 2
interval = 2
更有資訊價值。
因為程式本身已經看得出:
interval = 2
Comment 應補充程式碼本身無法直接表達的意圖。
19. 什麼是 Variable?
Variable:
變數
可以把它想成:
替一個資料取名字。
例如:
temperature = 28
代表建立:
temperature
這個名稱,指向數值:
28
之後:
print(temperature)
就會得到:
28
20. 建立第一個變數程式
建立:
nano variables.py
寫:
temperature = 28
humidity = 65
print(temperature)
print(humidity)
執行:
python3 variables.py
得到:
28
65
21. 變數可以改變
例如:
temperature = 28
print(temperature)
temperature = 30
print(temperature)
結果:
28
30
所以稱為:
Variable
因為值可以在程式過程中改變。
22. 變數名稱怎麼命名?
推薦:
temperature = 28
humidity = 65
led_state = True
sensor_name = "DHT22"
避免:
a = 28
b = 65
c = True
除非變數作用非常短而且意義明確。
好的名稱能讓程式更容易理解。
23. Python Variable 是 Case Sensitive
例如:
temperature = 28
Temperature = 30
這是兩個不同名稱。
所以:
temperature
和:
Temperature
不同。
和 Linux File Name 一樣,大小寫一定要注意。
24. Python 四個重要基本資料型別
本章先掌握:
int
float
str
bool
25. int:整數
例如:
led_count = 8
temperature = 28
year = 2026
這些沒有小數部分的整數可以是:
int
確認:
print(type(year))
會得到類似:
<class 'int'>
26. float:浮點數
例如:
temperature = 28.5
voltage = 3.3
humidity = 65.2
這些帶小數的數值通常使用:
float
查看:
print(type(temperature))
27. str:字串
文字資料使用:
str
例如:
name = "Raspberry Pi 5"
或者:
sensor = "DHT22"
顯示:
print(name)
結果:
Raspberry Pi 5
28. 單引號和雙引號
Python String 可以:
name = "Raspberry Pi"
也可以:
name = 'Raspberry Pi'
兩者都能表示字串。
重點是:
成對使用。
錯誤:
name = "Raspberry Pi'
這會造成 Syntax Error。
29. bool:布林值
Boolean:
True
False
例如:
led_on = True
network_connected = False
注意:
Python 使用:
True
False
首字母大寫。
不是:
true
false
30. bool 在 GPIO 程式會很常見
後面控制 LED 時可能有:
led_on = True
或:
alarm_active = False
所以 Boolean 在控制系統非常重要。
31. type() 查看資料型別
例如:
temperature = 28.5
sensor = "DHT22"
count = 10
alarm = False
print(type(temperature))
print(type(sensor))
print(type(count))
print(type(alarm))
這對初學 Debug 很有幫助。
32. 基本數學運算
Python 可以:
a = 10
b = 3
加:
print(a + b)
減:
print(a - b)
乘:
print(a * b)
除:
print(a / b)
33. 常見 Arithmetic Operators
| Operator | 用途 |
|---|---|
| + | 加 |
| - | 減 |
| * | 乘 |
| / | 除 |
| // | 整數除法 |
| % | 餘數 |
| ** | 次方 |
例如:
print(10 % 3)
結果:
1
34. % 在控制程式很實用
例如希望:
偶數循環
奇數循環
可以:
count = 5
if count % 2 == 0:
print("Even")
else:
print("Odd")
後面 LED 跑馬燈、輪流顯示等邏輯都可能用到。
35. 比較運算子
常用:
| Operator | 意義 |
|---|---|
| == | 等於 |
| != | 不等於 |
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
例如:
temperature = 32
print(temperature > 30)
結果:
True
36. = 和 == 完全不同
這是一個初學者非常容易犯的錯。
temperature = 30
代表:
Assignment
把 30 指派給 temperature。
而:
temperature == 30
代表:
Comparison
判斷 temperature 是否等於 30。
要特別分清楚。
37. print() 可以同時輸出文字和資料
例如:
temperature = 28.5
print("Temperature:", temperature)
結果:
Temperature: 28.5
這是後面 Sensor 程式非常常見的方式。
38. f-string
更方便的寫法:
temperature = 28.5
humidity = 65.2
print(f"Temperature: {temperature} C")
print(f"Humidity: {humidity} %")
結果:
Temperature: 28.5 C
Humidity: 65.2 %
這種:
f"...{variable}..."
稱為:
Formatted String Literal / f-string
後面我們會大量使用。
39. 小數格式化
例如:
temperature = 28.56789
print(f"Temperature: {temperature:.1f} C")
結果:
Temperature: 28.6 C
其中:
:.1f
表示顯示到小數一位。
感測器資料顯示時非常實用。
40. input() 讓使用者輸入資料
建立:
nano input_test.py
寫:
name = input("Please enter your name: ")
print(f"Hello, {name}")
執行:
python3 input_test.py
可能:
Please enter your name: Jason
Hello, Jason
41. input() 得到的是文字
例如:
age = input("Age: ")
即使輸入:
30
通常 age 仍然是:
str
可以驗證:
print(type(age))
42. int() 型別轉換
如果真的需要 Integer:
age = int(input("Age: "))
此時使用者輸入:
30
會轉成:
int
然後才能安全地:
next_year = age + 1
43. float() 型別轉換
例如輸入溫度:
temperature = float(
input("Temperature: ")
)
使用者輸入:
28.5
就轉成:
float
44. 型別轉換失敗會怎樣?
如果:
temperature = float(
input("Temperature: ")
)
但使用者輸入:
abc
Python 會產生:
ValueError
這就是後面要學習:
Exception Handling
的原因。
45. if:條件判斷
Raspberry Pi 控制程式最重要的語法之一就是:
if
例如:
temperature = 32
if temperature >= 30:
print("High temperature")
因為:
32 >= 30
是真的,所以會執行:
High temperature
46. Python 使用縮排表示程式區塊
這是 Python 非常重要的特色。
正確:
temperature = 32
if temperature >= 30:
print("High temperature")
注意:
print()
前面有縮排。
Python 官方 Tutorial 的控制流程也以縮排區分 if、迴圈與 Function 等 Code Block。
47. 縮排錯誤
錯誤例如:
if temperature >= 30:
print("High temperature")
可能造成:
IndentationError
所以 Python 不只是:
縮排看起來漂亮
而是:
縮排本身就是語法的一部分。
48. 建議統一四個 Space
本系列程式碼統一使用:
4 spaces
例如:
if temperature >= 30:
print("High temperature")
不要在同一份程式中混用不一致的 Tab / Space。
49. if / else
例如:
temperature = 25
if temperature >= 30:
print("Fan ON")
else:
print("Fan OFF")
輸出:
Fan OFF
這已經非常接近未來真正控制 Relay 的邏輯:
Temperature
↓
if >= 30
/ \
Yes No
│ │
Fan ON Fan OFF
50. if / elif / else
例如:
temperature = 28
if temperature >= 35:
print("Danger")
elif temperature >= 30:
print("Warning")
else:
print("Normal")
這樣就可以處理:
Danger
Warning
Normal
三種不同狀態。
51. and
例如:
temperature = 32
humidity = 80
if temperature >= 30 and humidity >= 70:
print("Hot and humid")
只有兩個條件都成立才執行。
52. or
例如:
temperature = 40
humidity = 40
if temperature >= 35 or humidity >= 90:
print("Alarm")
其中任何一個條件成立就會進入。
53. not
例如:
connected = False
if not connected:
print("Network disconnected")
not 會反轉 Boolean 狀態。
54. for Loop
如果要重複顯示五次:
for i in range(5):
print("Raspberry Pi")
輸出五次:
Raspberry Pi
Raspberry Pi
Raspberry Pi
Raspberry Pi
Raspberry Pi
55. range() 從 0 開始
例如:
for i in range(5):
print(i)
輸出:
0
1
2
3
4
不是:
1
2
3
4
5
這是初學時一定要注意的地方。
56. range(1, 6)
如果想顯示:
1
2
3
4
5
可以:
for i in range(1, 6):
print(i)
終點:
6
本身不包含在結果裡。
57. for Loop 未來怎麼用?
例如八顆 LED:
for led_number in range(8):
print(f"LED {led_number}")
這種迴圈可以延伸成:
LED 0 ON
LED 1 ON
LED 2 ON
...
所以 Loop 是 GPIO 程式很重要的能力。
58. while Loop
例如:
count = 0
while count < 5:
print(count)
count += 1
輸出:
0
1
2
3
4
59. += 是什麼?
count += 1
相當於:
count = count + 1
所以:
0
1
2
3
...
逐步增加。
60. 無限迴圈
Raspberry Pi 控制程式非常常看到:
while True:
print("Running")
這會一直執行。
概念很像 Arduino:
void loop()
{
}
因為 GPIO Controller、Sensor Monitor 往往要長時間持續運作。
61. 如何停止 while True?
在 Terminal 執行:
while True:
這類程式時,可以通常使用:
Ctrl + C
終止。
Python 會產生:
KeyboardInterrupt
後面我們會看到這其實也是一種 Exception。
62. break
例如:
count = 0
while True:
print(count)
count += 1
if count >= 5:
break
break 可以結束目前 Loop。
63. continue
例如:
for number in range(5):
if number == 2:
continue
print(number)
輸出:
0
1
3
4
因為:
2
那一次被跳過。
64. List 是什麼?
List 可以一次保存多個資料。
例如:
sensors = [
"DHT22",
"MCP3008",
"PIR",
"HC-SR04"
]
顯示:
print(sensors)
65. List Index 從 0 開始
例如:
sensors = [
"DHT22",
"MCP3008",
"PIR"
]
print(sensors[0])
得到:
DHT22
print(sensors[1])
得到:
MCP3008
這和 range() 從 0 開始的概念一致。
66. 用 for 逐一讀 List
sensors = [
"DHT22",
"MCP3008",
"PIR"
]
for sensor in sensors:
print(sensor)
輸出:
DHT22
MCP3008
PIR
這比:
print(sensors[0])
print(sensors[1])
print(sensors[2])
更容易維護。
67. len()
查看 List 有幾個項目:
print(len(sensors))
例如得到:
3
後面處理:
- GPIO Pin List
- Sensor List
- Data List
都會用到。
68. Function 是什麼?
Function:
函式
是把一組程式包成可以重複使用的功能。
例如:
def show_message():
print("Hello Raspberry Pi")
呼叫:
show_message()
才真正執行內容。
Python 官方 Tutorial 將 Function 定義列為控制流程的重要基礎語法之一。
69. 為什麼需要 Function?
如果相同程式碼到處複製:
print("Temperature")
print("Temperature")
print("Temperature")
程式越大越難維護。
可以做成:
def show_temperature():
print("Temperature")
再:
show_temperature()
使用。
70. Function 可以接受 Parameter
例如:
def show_temperature(value):
print(f"Temperature: {value:.1f} C")
呼叫:
show_temperature(28.5)
輸出:
Temperature: 28.5 C
其中:
value
就是 Parameter。
71. Function 可以 Return
例如:
def celsius_to_fahrenheit(celsius):
fahrenheit = celsius * 9 / 5 + 32
return fahrenheit
使用:
result = celsius_to_fahrenheit(25)
print(result)
得到:
77.0
72. 把程式拆成 Function 更適合 Raspberry Pi
後面程式可能變成:
def read_sensor():
pass
def update_display():
pass
def control_relay():
pass
def send_mqtt():
pass
主流程:
while True:
read_sensor()
update_display()
control_relay()
send_mqtt()
這樣比把所有程式擠在一起更容易:
- 閱讀
- Debug
- 修改
- 重複使用
73. pass 是什麼?
有時 Function 還沒有內容:
def read_sensor():
pass
pass 表示:
這裡目前什麼都不做,但保留合法程式結構。
適合先規劃程式架構。
74. Module 是什麼?
Python 可以把程式功能拆到不同 Module。
例如 Python 內建:
import time
之後就能使用:
time.sleep(1)
也就是暫停大約一段指定時間。
75. import
例如:
import time
print("Start")
time.sleep(2)
print("End")
執行:
Start
停一段時間,再:
End
後面 LED Blink 幾乎一定會用到類似時間控制。
76. from … import …
也可以:
from time import sleep
之後:
sleep(1)
不需要寫:
time.sleep(1)
兩種寫法都有用途。
本系列會依可讀性選擇。
77. 自己建立 Module
建立:
nano sensor_utils.py
寫:
def show_sensor_name(name):
print(f"Sensor: {name}")
再建立:
nano main.py
寫:
import sensor_utils
sensor_utils.show_sensor_name("DHT22")
執行:
python3 main.py
結果:
Sensor: DHT22
這就是最基本的自製 Module。
78. if name == “main” 是什麼?
後面會經常看到:
def main():
print("Program start")
if __name__ == "__main__":
main()
這種結構的目的,是區分:
直接執行這個檔案
與:
被其他 Python Module import
兩種情況。
對稍微正式一點的 Raspberry Pi Project,我建議逐步養成這種結構。
79. 第一個標準 Raspberry Pi Python 程式架構
例如:
def main():
print("Raspberry Pi Python")
print("Program started")
if __name__ == "__main__":
main()
執行:
python3 main.py
輸出:
Raspberry Pi Python
Program started
80. Syntax Error 是什麼?
例如:
print("Hello Raspberry Pi"
少了一個:
)
Python 可能顯示:
SyntaxError
代表:
程式語法本身無法正確解析。
Python 官方文件將 Syntax Error 與執行期間發生的 Exception 分開說明。
81. NameError
例如:
print(temperature)
但前面沒有建立:
temperature
可能看到:
NameError
意思是 Python 找不到這個名稱。
82. TypeError
例如:
age = "30"
print(age + 1)
可能出現:
TypeError
因為:
str
和:
int
不能直接以這種方式相加。
正確可以:
age = int("30")
print(age + 1)
83. ValueError
例如:
temperature = float("abc")
可能:
ValueError
因為:
abc
不能合理轉成浮點數。
84. ModuleNotFoundError
例如:
import some_library
但 Python Environment 沒安裝:
some_library
就可能看到:
ModuleNotFoundError
這時需要先確認:
你使用的是哪個 Python?
Library 安裝在哪個 Environment?
而不是直接亂執行 sudo pip install。
85. Exception Handling:try / except
Python 官方 Tutorial 將 try / except 作為捕捉與處理 Exception 的基本方式。
例如:
try:
temperature = float(
input("Temperature: ")
)
print(
f"Temperature: {temperature:.1f} C"
)
except ValueError:
print("Invalid temperature")
如果輸入:
abc
程式不會直接顯示一大段 Traceback 結束,而可以自己處理錯誤。
86. 為什麼 Raspberry Pi Sensor 程式需要 Exception?
因為實際硬體世界可能發生:
Sensor temporary failure
I²C error
Serial timeout
Network disconnected
Invalid data
File error
程式如果任何小問題都直接停止:
Sensor Error
↓
Entire Program Exit
對長時間 IoT 系統就不理想。
所以 Exception Handling 是後續很重要的能力。
87. KeyboardInterrupt 也可以處理
例如:
try:
while True:
print("Running")
except KeyboardInterrupt:
print("Program stopped")
當使用:
Ctrl + C
時,可以做比較乾淨的結束處理。
未來 GPIO 程式還可以在離開前:
- 關閉 LED
- 關 Relay
- 釋放資源
88. Python Package 和 Module 不完全一樣
初學先簡單理解:
Module
≈ 一個 Python 程式模組
Package
≈ 組織多個 Python Module 的套件
後面我們會安裝:
- GPIO Library
- MQTT Library
- Camera Library
這些可能由 Debian Package 或 Python Package 提供。
89. pip 是什麼?
pip 是 Python Package 安裝工具。
例如一般 Python Environment 可能使用:
pip install package-name
但是:
在現代 Raspberry Pi OS 上,這裡有一個非常重要的差異。
從 Raspberry Pi OS Bookworm 開始,Raspberry Pi 官方明確要求使用 pip 安裝 Python 第三方套件時應放在 Virtual Environment 中,而不是直接修改系統 Python Environment。
90. 為什麼直接 pip install 可能出錯?
如果在新版 Raspberry Pi OS 執行類似:
pip install some-package
可能看到和:
externally-managed-environment
相關的錯誤。
原因是:
APT
與:
pip
若同時任意修改 System Python Package,可能發生:
- Dependency Conflict
- Package Ownership Conflict
- 系統套件被覆蓋
Raspberry Pi 官方因此要求從 Bookworm 開始將 pip Package 安裝到 Python Virtual Environment;若是作業系統層級提供的套件,則優先使用 apt。
91. 不建議使用 –break-system-packages 當標準方法
有些錯誤訊息可能會告訴你可以使用:
--break-system-packages
繞過保護。
但這個名稱本身已經非常明白:
break system packages
它不是初學 Raspberry Pi 時應該採用的正常安裝流程。
比較好的方式:
System Package
↓
APT
Project Python Package
↓
venv + pip
92. Virtual Environment 是什麼?
Virtual Environment 簡稱:
venv
可以把它想成:
每個 Python Project 自己獨立的一套 Python 套件環境。
例如:
Project A
│
└── .venv
└── Package A Version 1
Project B
│
└── .venv
└── Package A Version 2
兩個 Project 不會輕易互相干擾。
Python 官方 venv 模組就是用來建立隔離 Python Environment。
93. 為什麼 Raspberry Pi 專案建議每個 Project 都有 venv?
因為後面可能同時做:
GPIO Project
MQTT Project
Camera Project
AI Project
各 Project 需要不同 Library。
例如:
Camera Project
↓
Package A 版本 X
AI Project
↓
Package A 版本 Y
Virtual Environment 可以把 Dependency 分開管理。
Raspberry Pi 官方也建議以每個 Project 一個 Virtual Environment 的方式管理 pip 套件。
94. 安裝完整 Python 支援
Raspberry Pi 官方目前建議,如果要建立 venv,先確保安裝:
sudo apt install python3-full
以取得完整 Python Environment 支援。
可以先:
sudo apt update
再:
sudo apt install python3-full
95. 建立第一個 Python Project
回 Home:
cd ~
建立:
mkdir -p raspberrypi-projects/python-demo
進入:
cd raspberrypi-projects/python-demo
96. 建立 .venv
執行:
python3 -m venv .venv
Python 官方 venv 可指定任何目標 Directory 建立虛擬環境;Raspberry Pi 官方也使用 python3 -m venv 作為目前 Raspberry Pi OS 的標準做法。
完成後:
ls -la
可以看到:
.venv
97. 為什麼叫 .venv?
其實可以叫:
venv
env
myenv
python-env
都可以。
本系列統一使用:
.venv
好處是:
- 一看就知道用途
- . 開頭讓 Directory 預設隱藏
- 每個 Project 結構一致
98. 啟用 Virtual Environment
Linux / Raspberry Pi OS:
source .venv/bin/activate
成功後 Shell Prompt 通常會出現:
(.venv)
例如:
(.venv) jason@rpi5-lab:~/raspberrypi-projects/python-demo $
表示:
現在已進入 Virtual Environment。
99. 確認目前 Python
進入 venv 後:
which python
可能看到:
/home/jason/raspberrypi-projects/python-demo/.venv/bin/python
而不是:
/usr/bin/python3
這正是 Virtual Environment 的核心。
100. venv 內的 Python
可以:
python --version
也可以:
python program.py
因為:
python
現在會指向:
.venv/bin/python
101. 查看 pip
在 venv 中:
which pip
可能看到:
.../.venv/bin/pip
此時:
pip install package-name
安裝的 Package 就會進:
這個 Project 的 venv
而不是系統 Python。
102. 離開 venv
輸入:
deactivate
Prompt 上:
(.venv)
就會消失。
再:
which python3
會回到 System Python。
103. 每次重新登入都要 activate 嗎?
通常是。
例如:
cd ~/raspberrypi-projects/python-demo
再:
source .venv/bin/activate
然後:
python main.py
這是一個正常 Project Workflow。
104. 建議的 Raspberry Pi Python Project 結構
例如:
python-demo/
│
├── .venv/
│
├── main.py
├── sensor.py
├── config.py
├── data/
└── README.txt
後續更大型的 Project 可以再增加:
logs/
templates/
static/
tests/
但初學不要一開始把架構搞得過度複雜。
105. 第一個完整 Python 實作
建立:
nano environment_monitor.py
內容:
def get_status(temperature):
if temperature >= 35:
return "Danger"
if temperature >= 30:
return "Warning"
return "Normal"
def main():
try:
temperature = float(
input("Temperature (C): ")
)
status = get_status(temperature)
print(
f"Temperature: "
f"{temperature:.1f} C"
)
print(
f"Status: {status}"
)
except ValueError:
print(
"Invalid temperature."
)
if __name__ == "__main__":
main()
106. 執行環境監測程式
python3 environment_monitor.py
輸入:
28.5
得到:
Temperature: 28.5 C
Status: Normal
輸入:
32
得到:
Temperature: 32.0 C
Status: Warning
輸入:
38
得到:
Temperature: 38.0 C
Status: Danger
107. 這個程式其實已經很接近真正 IoT 邏輯
現在資料是:
Keyboard Input
後面只要換成:
DHT22 Sensor
邏輯就會變成:
DHT22
│
▼
temperature
│
▼
get_status()
│
├── Normal
├── Warning
└── Danger
再加入 GPIO:
Danger
│
▼
Relay ON
就已經是實際自動控制系統。
108. Python 程式錯誤如何閱讀?
例如看到:
Traceback (most recent call last):
不要只看到紅字就認為:
Python 壞了
應該從最後幾行看:
Exception Type
+
Error Message
例如:
NameError
ValueError
TypeError
ModuleNotFoundError
通常會比最上面的 Traceback 更快指出方向。
109. 找 Line Number
Python Error 通常會指出:
File "main.py", line 15
所以先:
nano main.py
定位到問題附近。
不要完全靠猜。
110. Python Debug 的五個基本問題
遇到錯誤時先問:
1. 我執行哪個檔案?
2. 我目前在哪個 Directory?
3. 使用哪個 Python?
4. Variable Type 是什麼?
5. Error 最後一行寫什麼?
對應 Command:
pwd
ls -lah
which python3
或 venv:
which python
程式裡:
print(type(variable))
111. ModuleNotFoundError Debug 流程
如果:
ModuleNotFoundError
不要直接:
sudo pip install ...
先:
which python
再:
which pip
確認:
Python
和
pip
是不是同一個 venv。
更穩定可以:
python -m pip list
查看目前 Interpreter 所屬 Environment 的 Package。
112. 為什麼推薦 python -m pip?
例如:
python -m pip install package-name
可以更清楚地表達:
使用「現在這個 Python Interpreter」所對應的 pip。
這在同時存在:
- System Python
- venv
- 多個 Python
時更不容易混淆。
113. 不要隨便 sudo 執行自己的 Python
例如自己的程式:
python3 test.py
通常先用一般 User 執行。
不要習慣:
sudo python3 test.py
因為之後可能造成:
- File Owner 變 root
- Environment 不同
- HOME 不同
- venv 行為不同
- 權限開太大
真正需要特權時,應該先理解為什麼需要。
114. GPIO 也不代表所有 Python 都要 sudo
過去一些 GPIO 舊教學常常:
sudo python ...
但現代 Linux GPIO Library 與權限模型可能不同。
本系列後面的 GPIO 章節會依當時使用的 Library 與介面設定正確權限,不會先假設:
GPIO = sudo
這是比較健康的 Linux 使用方式。
115. Python 檔案可以直接執行嗎?
一般本系列先使用:
python3 program.py
最清楚。
Linux 也可以透過:
Shebang
+
Execute Permission
讓 Script 直接執行。
例如第一行:
#!/usr/bin/env python3
再:
chmod +x program.py
之後:
./program.py
但初學階段:
python3 program.py
比較能清楚知道使用哪個 Interpreter。
116. Virtual Environment Script 的 Shebang 要更小心
如果 Project 使用:
.venv
而你直接執行:
#!/usr/bin/env python3
結果會受到目前 Shell Environment 影響。
因此大型 Project 更應該清楚管理:
- venv
- Service
- Interpreter Path
後面做自動啟動 Service 時會再處理。
117. Python Interactive Mode 和 Script 怎麼選?
Interactive Mode
適合:
測一個 Expression
測 Variable
快速算數學
試 Module
Script
適合:
GPIO
Sensor
Project
Server
IoT
正式程式
正式 Raspberry Pi Project 應保存成:
.py
而不是只在 >>> 中操作。
118. Python 學習不要一次背完整語言
Raspberry Pi 初學階段最重要的是先掌握:
print
Variable
Data Type
Input
if
for
while
List
Function
Module
Exception
venv
這些已經足夠進入:
GPIO
後面遇到新的需求,再學:
- Dictionary
- Tuple
- Class
- JSON
- File
- Thread
- Async
- Context Manager
會更有效率。
119. 本章 Python 指令速查表
| 指令 | 用途 |
|---|---|
| python3 --version | 查看 Python 3 版本 |
| which python3 | 查看 System Python |
| python3 | Interactive Mode |
| python3 file.py | 執行 Python Script |
| python3 -m venv .venv | 建立 Virtual Environment |
| source .venv/bin/activate | 啟動 venv |
| deactivate | 離開 venv |
| which python | 查看目前 venv Python |
| which pip | 查看 pip |
| python -m pip list | 查看 Package |
| sudo apt install python3-full | 安裝完整 Python 支援 |
Raspberry Pi OS 從 Bookworm 開始要求 pip 安裝第三方套件時使用 venv,而 OS 層級 Package 則應優先由 APT 管理。
120. Python 語法速查表
| 語法 | 用途 |
|---|---|
| print() | 輸出 |
| input() | 輸入 |
| int() | 轉整數 |
| float() | 轉浮點數 |
| str() | 轉字串 |
| type() | 查看型別 |
| if | 條件 |
| elif | 其他條件 |
| else | 其餘情況 |
| for | 迴圈 |
| while | 條件迴圈 |
| range() | 產生數字範圍 |
| break | 離開 Loop |
| continue | 跳過本次 Loop |
| def | 定義 Function |
| return | 回傳 Function 結果 |
| import | 載入 Module |
| try | 嘗試執行 |
| except | 處理 Exception |
121. 建議的 Raspberry Pi Python 開發流程
之後每個 Python Project 可以採用:
建立 Project Directory
↓
建立 .venv
↓
Activate .venv
↓
安裝必要 Package
↓
建立 main.py
↓
分成 Functions
↓
執行
↓
觀察 Error
↓
Debug
↓
完成
這會比所有 Project 都混在:
/home/user
或 System Python 中乾淨很多。
122. 本章重點整理
完成本章後應掌握:
- Python 是 Raspberry Pi 很重要的應用程式開發語言。
- 本系列統一使用 Python 3。
- python3 --version 可以查看 Python Version。
- which python3 可以查看 Interpreter Path。
- Python 可以使用 Interactive Mode。
- .py 是常見 Python Source File 副檔名。
- python3 program.py 可以執行 Python Script。
- print() 用於輸出。
- # 可建立單行 Comment。
- Variable 用於保存及引用資料。
- int 是整數。
- float 是浮點數。
- str 是字串。
- bool 使用 True / False。
- type() 可以查看 Data Type。
- input() 取得使用者輸入。
- input() 取得的資料通常需要視需求轉型。
- int() 可以轉成 Integer。
- float() 可以轉成 Floating Point。
- if 用於條件判斷。
- elif 可以建立多個條件。
- else 處理其他情況。
- Python 使用縮排表示 Code Block。
- for 適合有限次迴圈。
- while 適合依條件持續執行。
- while True 在長時間 Raspberry Pi 控制程式中很常見。
- Ctrl + C 可以中斷前景程式。
- List 可以保存多個資料。
- Python Index 通常從 0 開始。
- def 建立 Function。
- Function 可以接受 Parameter。
- Function 可以使用 return 回傳結果。
- import 可以載入 Module。
- Python 可以建立自己的 Module。
- if __name__ == "__main__" 有助於區分直接執行與被 import。
- Syntax Error 代表語法錯誤。
- Exception 是執行期間可能發生的異常。
- try / except 可以處理 Exception。
- Raspberry Pi OS Bookworm 以後不應直接用 pip 修改 System Python。
- Python 第三方套件建議使用 Virtual Environment。
- python3 -m venv .venv 可以建立 venv。
- source .venv/bin/activate 可以啟動 Linux venv。
- venv 可以讓不同 Project 的 Python Dependency 分離。
- Raspberry Pi 官方建議系統 Package 使用 APT,Project Python Package 使用 venv + pip。
- 不應把 --break-system-packages 當成初學者正常安裝流程。
- 一般 Python Project 不應無理由全部使用 sudo。
- 遇到 Error 應先閱讀 Traceback 最後幾行。
- which python 與 which pip 是 Python Environment Debug 的重要工具。
- 程式應逐步分成 Function。
- 本章已經具備進入 GPIO Python 程式的基本能力。
FAQ:Raspberry Pi Python 入門常見問題
Q1:Raspberry Pi 適合學 Python 嗎?
適合。
Raspberry Pi 同時具有 Linux、Network、GPIO 與大量軟體開發能力,因此 Python 可以從一般程式設計一路延伸到硬體、網路、Camera 與 IoT。
Q2:Raspberry Pi 要使用 Python 2 還是 Python 3?
新專案應使用:
Python 3
本系列所有程式統一使用:
python3
或 Virtual Environment 內的:
python
Q3:如何查看 Raspberry Pi Python 版本?
使用:
python3 --version
Q4:Python 程式如何執行?
例如檔案:
hello.py
執行:
python3 hello.py
Q5:Python 程式一定要用 Thonny 嗎?
不一定。
Python Source File 本質上就是文字檔案。
本系列前期會優先使用:
Terminal
+
nano
+
python3
因為這套流程在:
- Desktop
- SSH
- Headless
都能使用。
之後也可以依需求改用 IDE。
Q6:Python 為什麼一直出現 IndentationError?
因為 Python 使用 Indentation 表示程式區塊。
例如:
if temperature >= 30:
print("Warning")
第二行必須屬於 if Block。
Python 官方 Tutorial 也是以縮排來表示控制流程及 Function 的程式區塊。
Q7:= 和 == 差在哪?
a = 10
是:
Assignment
而:
a == 10
是:
Comparison
這是 Python 初學最重要的差異之一。
Q8:input() 為什麼不能直接和數字相加?
因為 input() 取得的是文字資料。
例如:
age = int(input("Age: "))
要先轉成 Integer,再進行數值計算。
Q9:Raspberry Pi Python 如何暫停一秒?
可以:
import time
time.sleep(1)
或:
from time import sleep
sleep(1)
後面 LED Blink 會使用這類時間控制。
Q10:Raspberry Pi Python 可以一直執行嗎?
可以使用:
while True:
...
建立持續執行的主迴圈。
IoT Sensor、GPIO Controller、Server 等都常需要長時間運作。
Q11:如何停止一直執行的 Python 程式?
在前景 Terminal 中通常可以:
Ctrl + C
Python 會產生 KeyboardInterrupt,程式也可以自行捕捉它完成清理。
Q12:什麼是 Function?
Function 可以把一段功能包裝起來。
例如:
def turn_on_fan():
print("Fan ON")
之後只需要:
turn_on_fan()
就能執行這段功能。
Q13:什麼是 Module?
Module 可以把 Python 功能分到不同程式檔或載入標準函式庫。
例如:
import time
就載入 time Module。
Q14:什麼是 Exception?
Exception 是程式執行期間發生的異常情況,例如無效數值轉換、找不到 Module 或其他執行問題。
Python 官方 Tutorial 將 Syntax Error 與 Exception 分開處理,並提供 try / except 等機制處理例外。
Q15:為什麼 Raspberry Pi pip install 出現 externally-managed-environment?
因為從 Raspberry Pi OS Bookworm 開始,系統 Python Package 受到保護,官方要求使用 pip 的第三方 Package 安裝到 Python Virtual Environment,而不是任意修改系統 Python。
Q16:那 Raspberry Pi 現在如何安裝 Python Package?
先建立 venv:
python3 -m venv .venv
啟動:
source .venv/bin/activate
再:
python -m pip install package-name
Raspberry Pi 官方目前就是建議以 Virtual Environment 管理 pip 第三方套件。
Q17:什麼是 Python Virtual Environment?
它是一個隔離的 Python 執行環境,可以保存特定 Project 所需要的 Python Interpreter 設定與第三方 Package,降低不同 Project 之間的 Dependency 衝突。Python 官方提供內建 venv Module 建立這種環境。
Q18:每個 Raspberry Pi Project 都要建立 venv 嗎?
不是所有只有標準函式庫的簡單 Script 都強制需要。
但只要 Project 需要用 pip 安裝額外套件,在現代 Raspberry Pi OS 上採用:
一個 Project
+
一個 .venv
是非常好的做法,而且符合 Raspberry Pi 官方目前建議的套件管理方式。
Q19:可以直接 sudo pip install 嗎?
不建議。
尤其現代 Raspberry Pi OS 已經刻意保護 System Python。
更好的方法是:
APT
管理 OS Package,
以及:
venv + pip
管理 Project Python Package。
Q20:需要使用 –break-system-packages 嗎?
本系列正常教學:
不使用。
應優先採用 Virtual Environment,而不是繞過 System Python 的保護機制。
結語
完成本章後,我們終於讓 Raspberry Pi 從:
Linux Computer
進一步變成:
Programmable Linux Computer
現在已經具備:
Raspberry Pi
│
├── Raspberry Pi OS
├── Linux
├── Network
├── SSH
└── Python
而 Python 又已經掌握:
print()
↓
Variable
↓
Data Type
↓
Input
↓
if / else
↓
for / while
↓
List
↓
Function
↓
Module
↓
Exception
↓
Virtual Environment
更重要的是,我們剛剛製作的:
Temperature Input
↓
Python
↓
if / elif / else
↓
Normal / Warning / Danger
其實已經非常接近真正 Raspberry Pi 自動控制系統。
現在唯一缺少的是:
真實世界的硬體訊號。
下一章開始,我們就要正式離開純軟體世界。
Raspberry Pi Python 將第一次和:
40-pin GPIO
連接。
我們會真正理解:
- 哪一個 Pin 是 3.3V
- 哪一個 Pin 是 5V
- 哪些是 GND
- 哪些才是 GPIO
- Physical Pin 和 BCM GPIO 有什麼不同
- Raspberry Pi GPIO 為什麼不能直接接 5V 訊號
- GPIO Input / Output 到底如何工作
這也是整套 Raspberry Pi 課程正式進入電子實作的重要分界點。
下一章
第 7 章 Raspberry Pi 40-pin GPIO 完整介紹:BCM 編號、電壓與接線安全
下一章將正式學習:
- GPIO 是什麼
- Raspberry Pi 5 40-pin Header
- Physical Pin Number
- BCM GPIO Number
- 3.3V Pin
- 5V Pin
- GND
- GPIO Input
- GPIO Output
- Alternate Function
- I²C
- SPI
- UART
- PWM
- Raspberry Pi GPIO 3.3V Logic
- 為什麼 GPIO 不能直接輸入 5V
- GPIO 與 Arduino UNO 5V Logic 的差異
- GPIO 電流與負載觀念
- LED 為什麼需要限流電阻
- Relay 為什麼不能直接由 GPIO 線圈驅動
- Motor 為什麼需要 Driver
- Level Shifter
- Voltage Divider
- 共地 GND
- GPIO Pinout 閱讀方法
- 接線前的安全檢查
- 關機後接線的標準流程
完成第 7 章後,就可以進入第 8 章的第一個真正 Raspberry Pi GPIO 實作:
Python 控制 LED 閃爍與流水燈。