Permiso denegado haciendo os.mkdir (d) después de ejecutar shutil.rmtree (d) en Python

Muy a menudo en la consola de Windows 7 si ejecuto un progtwig de Python dos veces muy rápido, eso hace

if os.path.isdir(d): shutil.rmtree(d) if not os.path.exists(d): os.mkdir(d) 

donde d es el nombre de un directorio con muchos archivos, obtengo un “Permiso denegado” para el comando mkdir . Pero si ejecuto una vez, luego espere unos segundos, luego ejecute de nuevo, no recibo tal error. ¿Cuál es el problema aquí?

Hay tres cosas que vienen a la mente:

  1. El propio Windows retrasa algunas operaciones de archivo para preservar los metadatos. Si, por ejemplo, cambia el nombre de un archivo y crea otro en su ubicación, Windows tiene una ventana de tiempo donde las cosas, como las ACL, se transfieren al nuevo archivo. Esta es una “característica” para preservar estos metadatos incluso para los progtwigs que escriben un archivo nuevo antes de eliminar el anterior, para no perder datos cuando algo falla en el medio.

  2. Los escáneres de malware a veces se enganchan en las operaciones del sistema de archivos y realizan un escaneo de archivos, buscando malware (o textos críticos del gobierno, si es paranoico, y quizás incluso si no es paranoico). Durante esa exploración, se bloquean algunos otros accesos al archivo.

  3. Por último, no estoy seguro de cómo se implementa shutil.rmtree() , pero en Windows, algunas operaciones de árbol en realidad no son implementadas por el sistema operativo sino por el shell (es decir, Explorer) y podrían ejecutarse de forma asíncrona, lo que explicaría un ventana de tiempo breve en la que la ruta aún está bloqueada aunque la llamada ya haya sido devuelta.

Creo que, por ejemplo, Subversion o, más bien, el Apache Portable Runtime, tropezó con el mismo problema y lo resolvió simplemente volviendo a intentarlo con un retraso. Esta solución no gana un concurso de belleza, pero parece hacer el trabajo ™.