テクノロジー · 実用ガイド
Python の WinError 32?再試行の前に file handle の所有者を証明する
path は証拠であり所有者ではありません。権限変更、sleep、process 終了の前に Python object、child、directory context、external handle を追跡します。

WinError 32 は Python に高い権限が必要という意味ではなく、要求した Windows access/share mode が生きた handle と競合しています。所有者は current object、child、directory context、別 program のどれかです。
操作と path を固定し、current process から外へ owner を証明し、正式な lifecycle で一つだけ閉じて実 workload を再実行します。強制 close や一度だけ成功した sleep を修復にしません。
1. 正確な操作とパスを固定する
完全な traceback、winerror、元と先のパス、PID、thread、launcher、失敗した remove・rename・replace・rotation 呼び出しを記録し、試行前に元のバイトを保全します。
実際の watcher、worker、notebook、service、rotation 経路で一度再現し、管理者化、権限変更、sleep、無限 retry から始めません。
2. Python 自身が handle を保持しているか証明する
open、context manager、iterator、ZIP、image、PDF、workbook、mapping、logging handler を失敗箇所から逆に調べます。path 文字列ではなく library object が handle の所有者です。
変更処理を with の外へ移すか、finally で正式な close/shutdown を呼びます。lazy reader は metadata 取得後も file を保持できます。
3. 子 process、directory、重複所有者を調べる
生きている subprocess、worker、pool と継承 resource を記録します。親変数が消えても子が同じ file object を保持できるため、owner を join または shutdown し終了を確認します。
directory の rename/delete では親子の current directory を記録し、二重 open と process 間で複製された handle を分けます。
4. 強制 close せず外部 owner を特定する
自 process と子が clean なら Microsoft Handle または Process Explorer で正確な path を検索し、process、PID、account、時刻を記録します。
所有 application の正式な制御で停止または再設定します。Handle -c は不安定化の危険があるため通常修復に使いません。
5. 一つの owner だけ修復して再実行する
context を抜ける、library object を閉じる、child を join する、rotation owner を一つにするなど最小修復を行い、元のバイトと rollback を保持します。
実 workload を二回再実行し、操作成功、destination の byte と metadata、owner 解放、次周期での非再発を確認します。
