科技 · 實用指南
Python 顯示「.pyc bad magic number」?先證明 runtime 與 source 邊界
不要先刪光 cache 或修改 header;先確認 Python 實際載入的檔案、正在執行的 interpreter,以及可用 source 是否存在。

不要先刪光 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。
