這幾天在 Pi 400 的樹莓派 OS Trixie 上測試 Python 程式, 得知從 Bookworm 版本開始, Raspberry Pi OS 就遵循 PEP 668 限制, 禁止在系統 Python 安裝第三方套件, 必須建立虛擬環境去安裝, 然後進入虛擬環境執行 Python 程式. 如果在系統環境只能使用預載的套件 (例如 requests) :
pi@raspberrypi:~ $ python
Python 3.13.5 (main, Jun 25 2025, 18:55:22) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd # pandas 不是系統預載套件
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
import pandas as pd
ModuleNotFoundError: No module named 'pandas'
>>> import requests # requests 是系統預載套件
>>>
我以為建立虛擬套件並在其內安裝好第三方套件即可, 但實測發現套件雖然順利安裝, 但是匯入時卻出現 "無效指令" 並跳出 Python 互動環境 :
pi@raspberrypi:~ $ source myenv/bin/activate
(myenv) pi@raspberrypi:~ $ python
Python 3.13.5 (main, Jun 25 2025, 18:55:22) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yfinance as yf
無效指令
(myenv) pi@raspberrypi:~ $
詢問 ChatGPT 答覆說可能是這些套件不支援 Python 3.13, 叫我安裝較舊的 Python, 我就比照一切跑得順順的 LG Gram 筆電, 下載編譯安裝 Python 3.10.14, 參考 :
然後建立虛擬環境安裝套件, 例如 yfinance, 但是問題仍然存在 :
pi@raspberrypi:~ $ source myenv310/bin/activate
(myenv310) pi@raspberrypi:~ $ python
Python 3.10.14 (main, Nov 19 2025, 21:45:00) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yfinance as yf
無效指令
(myenv310) pi@raspberrypi:~ $
今天與 ChatGPT 進一步討論這問題, 它這時才提到說可能是缺少開發套件與編譯依賴, 有些套件例如 pandas, numpy, pandas-ta, 與 yfinance 等不是純 Python, 而是 C extension/Cython 編譯的套件, 需要在安裝時編譯 .so 檔, 且編譯過程依賴 libffi, zlib, readline, ncurses, 與 sqlite3 等系統套件, 如果這些依賴沒有安裝, pip 會在安裝時編譯失敗或跳過某些 C module, 套件雖然安裝完成, 但 import 時會因為 C extension 不存在或無法載入, Python REPL 就會出現 "無效指令" 而不是丟 exception.
總之, 在虛擬環境中安裝套件之前, 還必須用 apt 安裝下表套件 (不早一點說, 害我白花時間去下載編譯安裝 Python 3.10) :
| 套件 | 用途 |
|---|---|
| build-essential | 安裝 GCC 與編譯器工具,用於編譯 Python 擴充套件 |
| libssl-dev | 支援 HTTPS、SSL、Python 的 ssl 模組 |
| zlib1g-dev | 支援壓縮功能,啟用 gzip、zipfile 等模組 |
| libncurses5-dev / libncursesw5-dev | 提供互動終端介面支援(如 Python 互動輸入、編輯器) |
| libreadline-dev | 支援 command line 操作時的輸入、歷史紀錄 |
| libffi-dev | 讓 Python 的 ctypes 和 cffi 模組正常工作 |
| libsqlite3-dev | 支援 Python 內建 sqlite3 資料庫模組 |
| libbz2-dev | bz2 壓縮支援,啟用 Python 的 bz2 模組 |
| liblzma-dev | LZMA 壓縮支援,啟用 Python 的 lzma 模組(例如 tar.xz) |
| libgdbm-dev | 支援 Python shelve / dbm 資料儲存模組 |
| libdb-dev | 支援 Berkeley DB,啟用 dbm 模組 |
| libexpat1-dev | 支援 XML parsing,啟用 Python 的 xml parser 模組 |
| libmpdec-dev | 支援 decimal 模組的高精度數學運算 |
| tk-dev | 啟用 tkinter GUI 支援(可視介面) |
| uuid-dev | 支援 Python 的 uuid 模組,用於生成唯一識別碼 |
所以, 其實系統的 Python 3.13 必須先用 apt 安裝這些套件後, 再建立虛擬環境來安裝第三方套件, 這樣 pandas 等依賴 C extension 的套件才能正常匯入使用, 先更新套件清單 :
sudo apt update
sudo apt upgrade -y
然後執行下列指令即可 :
sudo apt install -y python3.13-venv python3.13-dev build-essential libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev wget curl llvm
安裝完成後建立一個虛擬環境 myenv313 :
pi@raspberrypi:~ $ python3.13 -m venv ~/myenv313
進入虛擬環境 :
pi@raspberrypi:~ $ source myenv313/bin/activate
然後在此虛擬環境下安裝套件 :
1. 資料科學基礎套件 :
pip install numpy==2.2.6
pip install pandas
pip install scipy
pip install matplotlib
pip install seaborn
pip install bokeh
pip install plotly
pip install scikit-learn
註 : 因 pandas-ta 0.4.71b 依賴 numpy 2.2.6, 故先行指定此版本.
2. 深度學習框架 :
pip install torch torchvision torchaudio
3. Web UI :
pip install django
pip install gradio
註 : streamlit 依賴許多 C extension, 與樹莓派 Trixie 的 Python 3.13 部分不相容, 會導致 Python 執行環境崩潰, 勿安裝.
4. 爬蟲 :
pip install html5lib
pip install selenium
pip install scrapy
5. 量化投資 :
pip install yfinance
pip install twstock
pip install mplfinance
pip install ta
pip install kbar
pip install backtrader
pip install pyfolio-reloaded
6. Bot 套件 :
pip install line-bot-sdk
pip install python-telegram-bot
7. LLM 套件 :
pip install openai
pip install google-generativeai
8. 開發工具 :
pip install jupyterlab
安裝完後測試看看能否正常匯入套件 :
pi@raspberrypi:~ $ source ~myenv313/bin/activate
(myenv313) pi@raspberrypi:~ $ python
Python 3.13.5 (main, Jun 25 2025, 18:55:22) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import yfinance as yf
>>> yf.__version__
'0.2.66'
>>> import pandas_ta as ta
>>> ta.version
'0.4.71b0'
可見 pandas-ta 已經是最新版 0.4.71b 了.
回顧之前在 Bookworm 上遇到的無法匯入已安裝好的第三方套件問題, 其原因也是如此, 沒有先安裝 C extension/Cython 開發套件與編譯依賴就直接在虛擬環境下用 pip 安裝套件, 貌似順利安裝完成, 但其實過程中找不到 C extension 依賴檔就跳過, 誤以為安裝成功所致. 既然在最新版的 Trixie 上已找到問題原因並解決了, 那也沒必要回去用 Bookworm 啦.
如果要用 Thonny 開發 Python 應用, 須至 "工具/選項/直譯器" 選單中, 設定 Python 直譯器為 :
home/pi/myenv313/bin/python
沒有留言 :
張貼留言