本篇是故事二的「踩雷」篇。
本篇要回答:同一台電腦、同一份程式碼,為什麼會產生互相矛盾的測試結果?
本機測試卡關了好一陣子,症狀清單長這樣:套件明明已經安裝,程式卻說找不到;IDE 按下執行鍵一切正常,切到 OS Terminal 跑同一支測試卻失敗;某幾次情況相反——Terminal 通過,IDE 的結果不一樣。同一台電腦、同一份原始碼,兩套互相矛盾的結果。
(本故事依親身經驗去識別化重建:IDE 與作業系統名稱略去,錯誤訊息細節以示意呈現;可實際執行的指令與行為皆經過驗證。)
最消耗的不是錯誤本身,而是矛盾:每一個工具都能出示自己的不在場證明。IDE 說我能跑,pip 說我裝好了,Terminal 說我找不到模組。當所有人都沒問題,剩下的解釋就只能往玄學走——重開機、重裝套件、換個資料夾再試一次。
當時輪流懷疑了套件(是不是壞了)、IDE(是不是快取)、作業系統(是不是權限),甚至懷疑程式碼自己(是不是有隱藏字元)。唯獨沒有懷疑「執行環境」這個概念,因為在我當時的世界觀裡,「我的電腦」就是一個環境——單數。
背後的執行假設是:同一台電腦等於同一個 Python。這個假設錯得很安靜,它自己不會報錯,只會讓其他所有證據變得無法解釋。
止住玄學的第一步不是修,而是要求兩邊各自報上身分。在 IDE 與 Terminal 各跑一次:
import sys
print(sys.executable)
兩邊印出的路徑不一樣。問題在這一刻第一次有了形狀:不是程式碼時好時壞,是根本有兩個 Python 在輪班。
區分證據等級。已確認事實:兩邊的 interpreter 路徑不同。合理推論:套件只裝進了其中一個環境,所以「已安裝」與「找不到」同時為真。尚未排除:兩個環境的 Python 與套件版本差異、測試命令與工作目錄是否也不同——這些留給後面幾天逐一採證。
留下一個把玄學變回工程的起手式:
在懷疑任何一方說謊之前,先讓每一方報出自己的 sys.executable。
本篇結論:
同一份程式碼沒有同時活在兩個世界;真正不同的是執行它的 Python、套件與環境設定。
下一篇(Day 07)把「報身分」擴充成完整的環境採證清單:你說的 Python,到底是哪一個 Python?