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

科技 · 實用指南

Python 出現 WinError 32?重試前先證明誰持有檔案控制代碼

路徑是證據,不是擁有者。修改權限、sleep 或終止程序前,先追蹤仍存活的 Python 物件、子程序、目錄情境與外部控制代碼。

Python 出現 WinError 32?重試前先證明誰持有檔案控制代碼: handle owner graph
原創示意圖:先識別擁有者,再變更系統。 Watch at Ease

WinError 32 不是要求 Python 取得更高權限,而是 Windows 存取或共享模式與存活控制代碼衝突。擁有者可能是目前物件、子程序、目錄情境或另一程式。

固定操作與路徑,從目前程序向外證明擁有者,以支援的生命週期關閉一個擁有者,再重播真實工作負載。不要強制關閉,也不要把一次 sleep 通過當修復。

1. 固定精確操作與路徑

記錄完整回溯、winerror、來源與目標路徑、PID、執行緒、啟動器,以及失敗的是刪除、重新命名、替換或輪替。實驗前保留來源位元組。

在真實 watcher、worker、notebook、服務或日誌輪替路徑中重現一次;不要先提權、改權限、sleep、停用掃描或無限重試。

2. 證明 Python 是否仍持有控制代碼

從失敗呼叫向後稽核每個 open、內容管理器、迭代器、ZIP、影像、PDF、活頁簿、映射檔與日誌 handler。路徑字串沒有 close;函式庫物件才是擁有者。

把變更移到 with 區塊外,或在 finally 中呼叫支援的 close 或 shutdown。延遲讀取器回傳中繼資料後仍可能保持開啟。

3. 檢查子程序、目錄與重複擁有者

記錄仍存活的 subprocess、worker、pool 與繼承資源。父變數消失後子程序仍可能保留檔案物件;先 join 或關閉擁有者並證明退出。

重新命名或刪除目錄時記錄父子程序的目前工作目錄,並區分重複開啟與跨程序複製控制代碼。

4. 不強制關閉地識別外部擁有者

若目前程序與子程序乾淨,用 Microsoft Handle 或 Process Explorer 搜尋精確路徑,記錄程序、PID、帳戶與時間。

透過應用程式支援的方式停止或重新設定擁有者。不要把 Handle -c 當例行修復;強制關閉可能造成不穩定。

5. 只修一個擁有者並重播工作負載

實施最小修復並保留原始位元組與回復路徑。只有證據證明外部擁有者短暫時,才採有界重試。

連續兩次重播原工作負載;操作、位元組、metadata 與擁有者清理都必須通過,下一個週期不得復發。

Python 出現 WinError 32?重試前先證明誰持有檔案控制代碼: repair and acceptance matrix
原創示意圖:只修復一個擁有者,並重播真實工作負載。 Watch at Ease