기술 · 실용 가이드
Python WinError 32? 재시도 전에 파일 handle 소유자를 증명하세요
경로는 증거이지 소유자가 아닙니다. 권한 변경, sleep, process 종료 전에 Python object, child, directory context와 external handle을 추적하세요.

WinError 32는 Python에 더 높은 권한이 필요하다는 뜻이 아니라 요청한 Windows access/share mode가 살아 있는 handle과 충돌한다는 뜻입니다. owner는 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, 무한 재시도로 시작하지 마세요.
2. Python이 아직 handle을 소유하는지 증명하세요
open, context manager, iterator, ZIP, image, PDF, workbook, mapping, logging handler를 실패 호출에서 거꾸로 추적하세요. 경로 문자열이 아니라 library object가 handle 소유자입니다.
변경 작업을 with 바깥으로 옮기거나 finally에서 지원되는 close/shutdown을 호출하세요. lazy reader는 metadata 반환 후에도 파일을 열어 둘 수 있습니다.
3. 자식 process, directory와 중복 소유자를 확인하세요
살아 있는 subprocess, worker, pool과 상속 resource를 기록하세요. 부모 변수가 사라져도 자식이 같은 file object를 유지할 수 있으므로 owner를 join 또는 shutdown하고 종료를 증명하세요.
directory rename/delete에서는 부모와 자식의 current directory를 기록하고 중복 open과 복제 handle을 구분하세요.
4. 강제 종료 없이 외부 소유자를 찾으세요
현재 process와 자식이 깨끗하면 Microsoft Handle 또는 Process Explorer로 정확한 path를 검색하고 process, PID, account, 시간을 기록하세요.
애플리케이션의 지원 제어로 owner를 중지하거나 재구성하세요. Handle -c는 불안정을 만들 수 있으므로 일반 수정으로 사용하지 마세요.
5. 하나의 owner만 수정하고 workload를 재실행하세요
context 종료, library object 닫기, child join, 단일 rotation owner 같은 최소 수정을 적용하고 원본 바이트와 rollback을 보존하세요.
실제 workload를 두 번 재실행하여 작업, 대상 바이트와 metadata, owner 정리, 다음 주기의 비재발을 확인하세요.
