2026年1月5日 星期一

樹莓派 (Pi 3) 開機時自動執行帶有 Python 虛擬環境 (venv) 的腳本

 要在樹莓派 (Pi 3) 開機時自動執行帶有 Python 虛擬環境 (venv) 的腳本,最推薦使用 systemd 服務(穩定可靠)或透過修改 autostart 檔案(適用於圖形界面登入後)來達成,重點在於確保腳本能激活虛擬環境 (source venv/bin/activate),再運行你的 Python 程式。 

方法一:使用 systemd (推薦,最穩健)
  1. 建立啟動腳本 (start_venv_app.sh):
    bash
    #!/bin/bash
    source /path/to/your/venv/bin/activate # 替換成你的 venv 路徑
    python3 /path/to/your/app.py # 替換成你的 Python 程式路徑
    deactivate # 可選,關閉 venv
    
    • 設定權限chmod +x start_venv_app.sh
  2. 建立 systemd 服務檔案 (例如 /lib/systemd/system/my-python-app.service):
    ini
    [Unit]
    Description=My Venv Python App
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/path/to/start_venv_app.sh # 替換成你的啟動腳本路徑
    WorkingDirectory=/path/to/your/app/folder # 程式執行目錄 (可選)
    Restart=always # 程式崩潰時自動重啟
    User=pi # 以 pi 帳號運行
    
    [Install]
    WantedBy=multi-user.target
    
  3. 啟動與設定開機啟動:
    bash
    sudo systemctl daemon-reload
    sudo systemctl enable my-python-app.service
    sudo systemctl start my-python-app.service
    
方法二:修改 LXDE-pi autostart (適用圖形界面登入後)
  1. 開啟 autostart 檔案:
    sudo nano /etc/xdg/lxsession/LXDE-pi/autostart.
  2. 加入啟動指令 (開啟終端機並執行):
    @lxterminal -e "/bin/bash -c 'source /path/to/your/venv/bin/activate && python3 /path/to/your/app.py'" .
    • 或者在同目錄下創建一個腳本文件(如 my_script.sh 包含 source ... && python3 ...)給它執行權限,然後 @lxterminal -e /path/to/my_script.sh. 
方法三:使用 cron (用於定時任務或用戶登入)
  • 使用者登入時執行 (crontab -e):
    @reboot /bin/bash -c 'source /path/to/your/venv/bin/activate && python3 /path/to/your/app.py'.
     
重要提示
  • 路徑:記得將所有 /path/to/... 替換為你實際的虛擬環境和 Python 程式路徑。
  • 權限:確保你的 Python 程式和腳本有執行權限 (chmod +x)。
  • venv激活source /path/to/venv/bin/activate 是關鍵,它會讓後續的 python3 指令使用虛擬環境中的 Python. 
要在 Raspberry Pi (Python 3) 實現開機自動於背景啟動程式,最推薦且符合 2026 年 Linux 標準的方法是使用 systemd
以下是設定步驟:
1. 建立服務設定檔
在系統服務目錄中建立一個 .service 檔案(例如 my_script.service):
bash
sudo nano /etc/systemd/system/my_script.service
請謹慎使用程式碼。
2. 寫入服務內容
將以下內容貼上,並修改 ExecStart 為你的 Python 路徑與檔案路徑:
ini
[Unit]
Description=My Python Script Service
After=multi-user.target

[Service]
# 指定執行使用者(通常是 pi)
User=pi
# 設定工作目錄
WorkingDirectory=/home/pi/your_folder
# 執行指令(請使用完整路徑)
ExecStart=/usr/bin/python3 /home/pi/your_folder/your_script.py
# 若程式崩潰自動重啟
Restart=always

[Install]
WantedBy=multi-user.target
請謹慎使用程式碼。
3. 啟動並啟用服務
執行以下指令讓系統載入新服務並設定開機啟動:
bash
# 重新載入設定
sudo systemctl daemon-reload

# 設定開機自動啟動
sudo systemctl enable my_script.service

# 立即啟動服務(測試用)
sudo systemctl start my_script.service
請謹慎使用程式碼。
4. 管理與除錯
  • 查看狀態: sudo systemctl status my_script.service
  • 停止服務: sudo systemctl stop my_script.service
  • 查看背景輸出日誌: journalctl -u my_script.service -f

其他替代方案
  • crontab (最簡單): 執行 crontab -e 並加入 @reboot python3 /path/to/script.py &。雖然簡單,但不如 systemd 穩定且難以管理日誌。
  • rc.local: 較舊的方法,在現代 Raspberry Pi OS 中已逐漸被 systemd 取代,不建議優先使用。
若需要更詳細的教學,可參考 Raspberry Pi 官方文件 (systemd)

沒有留言:

張貼留言