2009-07-31 9 views
25

Estoy intentando que python elimine algunos directorios y obtengo errores de acceso sobre ellos. Creo que es que la cuenta de usuario de Python no tiene derechos.¿Qué usuario ejecutan los scripts Python como en Windows?

WindowsError: [Error 5] Access is denied: 'path' 

es lo que obtengo cuando ejecuto el script.
He intentado

shutil.rmtree 
os.remove 
os.rmdir 

todos vuelven el mismo error.

+0

Bueno, ¿con qué cuenta de usuario * do * ejecuta el script?Normalmente deberías saber, al menos en tus máquinas y si configuraste el script para ejecutar ... – Joey

+0

Solo lo estoy ejecutando como yo mismo, y puedo eliminarlo directamente de forma manual, así que estoy pensando que es una ventana extraña y Desconexión de permisos python – DevelopingChris

+0

Intente ejecutar el script con "Process Monitor" de SysInternals para ver exactamente qué objeto (archivo, directorio o lo que) se produce el error y en qué proceso ocurre. "Process Explorer" puede decirle qué credenciales es el proceso corriendo bajo (tal vez Process Monitor también puede; no estoy seguro). –

Respuesta

49

Hemos tenido problemas al eliminar archivos y directorios en Windows, incluso si los hubiéramos copiado, si se hubieran configurado como 'readonly'. shutil.rmtree() le ofrece tipo de manejadores de excepciones para manejar esta situación. Usted lo llama y proporciona un manejador de excepciones como este:

import errno, os, stat, shutil 

def handleRemoveReadonly(func, path, exc): 
    excvalue = exc[1] 
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES: 
     os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777 
     func(path) 
    else: 
     raise 

shutil.rmtree(filename, ignore_errors=False, onerror=handleRemoveReadonly) 

Es posible que desee intentar eso.

+2

También vea la función 'onerror' en http://www.voidspace.org.uk/downloads/pathutils.py –

+0

Obtengo: NameError: name 'stat' no está definido EDIT: requiere que lo haga ' import stat 'en la parte superior de su script. Resolvió mi problema sin embargo. ¡Muchas gracias! – anon58192932

+2

Intenté esta solución, ahora tengo el error '[Error 5] Acceso denegado' con esta línea:' os.chmod (path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) # 0777 ' – Johanna

4

Nunca he usado Python, pero supongo que se ejecuta como el usuario que ejecuta el script.

+0

ok, entonces aparentemente corre como yo, ¿por qué no puedo eliminar el archivo a través de python, pero puedo hacerlo si lo elimino a través de rmdir en la línea de comando? – DevelopingChris

+0

¿Acabas de tener la ruta codificada? ¿Estás seguro de que es el camino correcto? No puedo pensar en ninguna razón por la que no funcionaría si puedes hacerlo manualmente. –

+0

Sí, lo tenía dinámicamente obteniendo el camino de un listdir, pero luego cuando eso se solucionaba, simplemente pongo el mismo camino en python, configuro el escenario y python no puede eliminarlo pero puedo si uso cmd – DevelopingChris

0

¿Cómo está ejecutando el script? Desde una sesión de consola interactiva? Si es así, solo abre una ventana de comandos de DOS (usando cmd) y escribe 'whoami'. Esa es la persona a la que está ejecutando los scripts de manera interactiva.

Ok, vi sus ediciones ahora mismo ... ¿por qué no imprime la ruta y verifica las propiedades para ver si la cuenta de usuario que ejecuta los scripts tiene los privilegios necesarios?

Si whoami no funciona en su versión de Windows, puede usar variables de entorno como SET USERNAME y SET DOMAINNAME desde la ventana de comandos.

+1

whoami es un comando * nix, no windows. –

+2

@ Max: ¿lo has probado en Windows? Funciona bien. – Kevin

+0

Lo probé, no funciona para mí –

0

Si la secuencia de comandos se ejecuta como una tarea programada (lo que parece probable para una secuencia de comandos de limpieza), probablemente se ejecutará como SISTEMA. Es (imprudente, pero) posible establecer permisos en directorios para que SYSTEM no tenga acceso.

+0

Las tareas programadas se ejecutan como cualquier usuario que le indique que se ejecute. Sin embargo, creo que en versiones anteriores de Windows esto no es verdad. –

0

¿Están vacíos los directorios y, de no ser así, esos métodos son compatibles con la eliminación del contenido de un directorio?

3

Las secuencias de comandos no tienen ningún usuario especial, simplemente se ejecutan bajo el usuario actualmente conectado que ejecutó la secuencia de comandos.

Ha intentado comprobar que:

  • que está intentando eliminar una ruta válida? y que
  • la ruta no tiene archivos bloqueados?
0

@ThomasH: otro ladrillo en la pared.

En los sistemas Unix, debe asegurarse de que el directorio principal también se pueda escribir. Aquí es otra versión:

def remove_readonly(func, path, exc): 
    excvalue = exc[1] 
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES: 

     # ensure parent directory is writeable too 
     pardir = os.path.abspath(os.path.join(path, os.path.pardir)) 
     if not os.access(pardir, os.W_OK): 
      os.chmod(pardir, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) 

     os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777 
     func(path) 
    else: 
     raise 
+0

De acuerdo con la [Documentación de Python] (https://docs.python.org/2/library/shutil.html?highlight=shutil#shutil.rmtree), _Excepciones generadas por onerror no serán cogido_ así que no estoy seguro de que la declaración _raise_ signifique algo. – kmarsh

0

solución simple después de buscar durante horas es comprobar primero si existe realmente esa carpeta!

GIT_DIR="C:/Users/...." 
if os.path.exists(GIT_DIR): 
    shutil.rmtree(GIT_DIR) 

Esto hizo el truco para mí.

+0

La diferencia es que acabo de crearlo en la línea de código anterior. Entonces, 100% existe con certeza. Pero hay un problema de acceso en los adaptadores de nivel de sistema operativo de Windows. – DevelopingChris

Cuestiones relacionadas