第6章 Raspberry Pi Python 入門:建立與執行第一支 Python 程式

發布日期: |更新日期:
文章主圖:第6章 Raspberry Pi Python 入門:建立與執行第一支 Python 程式

前面五章,我們已經完成:

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

Python 常見算術運算子
Operator 用途
+ 加
- 減
* 乘
/ 除
// 整數除法
% 餘數
** 次方

例如:

print(10 % 3)

結果:

1

34. % 在控制程式很實用

例如希望:

偶數循環
奇數循環

可以:

count = 5

if count % 2 == 0:
    print("Even")
else:
    print("Odd")

後面 LED 跑馬燈、輪流顯示等邏輯都可能用到。

35. 比較運算子

常用:

Python 常見比較運算子
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 指令速查表

Raspberry Pi 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 語法速查表

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. 本章重點整理

完成本章後應掌握:

  1. Python 是 Raspberry Pi 很重要的應用程式開發語言。
  2. 本系列統一使用 Python 3。
  3. python3 --version 可以查看 Python Version。
  4. which python3 可以查看 Interpreter Path。
  5. Python 可以使用 Interactive Mode。
  6. .py 是常見 Python Source File 副檔名。
  7. python3 program.py 可以執行 Python Script。
  8. print() 用於輸出。
  9. # 可建立單行 Comment。
  10. Variable 用於保存及引用資料。
  11. int 是整數。
  12. float 是浮點數。
  13. str 是字串。
  14. bool 使用 True / False。
  15. type() 可以查看 Data Type。
  16. input() 取得使用者輸入。
  17. input() 取得的資料通常需要視需求轉型。
  18. int() 可以轉成 Integer。
  19. float() 可以轉成 Floating Point。
  20. if 用於條件判斷。
  21. elif 可以建立多個條件。
  22. else 處理其他情況。
  23. Python 使用縮排表示 Code Block。
  24. for 適合有限次迴圈。
  25. while 適合依條件持續執行。
  26. while True 在長時間 Raspberry Pi 控制程式中很常見。
  27. Ctrl + C 可以中斷前景程式。
  28. List 可以保存多個資料。
  29. Python Index 通常從 0 開始。
  30. def 建立 Function。
  31. Function 可以接受 Parameter。
  32. Function 可以使用 return 回傳結果。
  33. import 可以載入 Module。
  34. Python 可以建立自己的 Module。
  35. if __name__ == "__main__" 有助於區分直接執行與被 import。
  36. Syntax Error 代表語法錯誤。
  37. Exception 是執行期間可能發生的異常。
  38. try / except 可以處理 Exception。
  39. Raspberry Pi OS Bookworm 以後不應直接用 pip 修改 System Python。
  40. Python 第三方套件建議使用 Virtual Environment。
  41. python3 -m venv .venv 可以建立 venv。
  42. source .venv/bin/activate 可以啟動 Linux venv。
  43. venv 可以讓不同 Project 的 Python Dependency 分離。
  44. Raspberry Pi 官方建議系統 Package 使用 APT,Project Python Package 使用 venv + pip。
  45. 不應把 --break-system-packages 當成初學者正常安裝流程。
  46. 一般 Python Project 不應無理由全部使用 sudo。
  47. 遇到 Error 應先閱讀 Traceback 最後幾行。
  48. which python 與 which pip 是 Python Environment Debug 的重要工具。
  49. 程式應逐步分成 Function。
  50. 本章已經具備進入 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 閃爍與流水燈。

下一步學習

不要停在這一篇,接著把內容做成自己的實作

目前主題:Raspberry Pi。從完整學習路線、免費資源、會員下載,再接到實作所需材料。

同系列:Raspberry-Pi |  已是會員?直接前往 Getfile
相關資源與會員文章下載
文章可免費閱讀;下載完整 DOCX 或 PDF 需登入免費基本會員。
查看相關資源 會員免費下載 DOCX 會員免費 PDF/列印

← 回文章列表