Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

Python 顯示「.pyc bad magic number」?先證明 runtime 與 source 邊界

不要先刪光 cache 或修改 header;先確認 Python 實際載入的檔案、正在執行的 interpreter,以及可用 source 是否存在。

定位 pyc、runtime 與 magic bytes 的圖
原創插畫:先證明不相容邊界。 Watch at Ease

不要先刪光 cache 或修改 header;先確認 Python 實際載入的檔案、正在執行的 interpreter,以及可用 source 是否存在。

pyc header 以 interpreter 專屬 magic bytes 開頭。 importlib.util.MAGIC_NUMBER 顯示目前值。

1. 記錄失敗檔與 interpreter

清理前保存完整 traceback,記錄 sys.executable、sys.version、cache_tag、工作目錄、import 相關環境變數與失敗路徑。shell 的 python 不一定是服務或 IDE 真正使用的 interpreter。

由 traceback 或 import discovery 定位精確檔案,檢查 sys.path、virtual environment、mount 與 deployment copy。錯誤證明該 bytecode 不相容,不代表所有 pyc 都錯。

2. 唯讀比較 header

將檔案當資料讀取前四 bytes,和真正失敗 interpreter 的 importlib.util.MAGIC_NUMBER 比較;不要為檢查而執行不可信 bytecode。

不符合可證明不是此 interpreter 的 bytecode;符合也不是安全證明,後續 header、marshal code 或 source 關係仍可能損壞。

3. 區分 source 與 pyc-only

權威 .py 存在時保留舊 pyc,只移除精確 cache,讓目標 interpreter 重建,並確認 cache 目錄可寫。

pyc-only deployment 刪除後沒有 source 可重建。應取得 source 或用目標 runtime 重建,不要只改 magic bytes。

4. 產生或重建正確 artifact

已安裝 package 應對照 metadata,從可信 wheel 或 source 在乾淨環境重裝。PyPA 指出 wheel 通常不帶 pyc,而由 installer 本機產生。

container 與 serverless bundle 要在 production runtime 下乾淨重建,排除 host __pycache__,升級 interpreter 後不共用舊 cache。

5. 驗證 import 並防止復發

以真實入口重啟,核對 executable、import origin、module version,並在新 process 驗證代表性 imports。

記錄路徑、magic bytes、runtime、source 狀態、rebuild 來源與結果;增加 clean-build 檢查阻擋意外 pyc-only 或 foreign cache。

source、pyc-only 與 package 恢復圖
原創插畫:重建而非修改 header。 Watch at Ease