2009-02-11 35 views
7

En Python en Windows, ¿hay alguna manera de determinar si un usuario tiene permiso para acceder a un directorio? He echado un vistazo al os.access pero arroja resultados falsos.Python - Probar los permisos del directorio

>>> os.access('C:\haveaccess', os.R_OK) 
False 
>>> os.access(r'C:\haveaccess', os.R_OK) 
True 
>>> os.access('C:\donthaveaccess', os.R_OK) 
False 
>>> os.access(r'C:\donthaveaccess', os.R_OK) 
True 

¿Hago algo mal? ¿Hay una mejor manera de verificar si un usuario tiene permiso para acceder a un directorio?

+1

El primer y el tercer acceso están fallando porque el \ h se interpreta como una secuencia de escape (no válida) –

Respuesta

7

Puede ser complicado verificar los permisos en Windows (¡tenga cuidado con los problemas en Vista con UAC, por ejemplo! - vea esto related question).

¿Estás hablando de acceso de lectura simple, es decir, leyendo los contenidos del directorio? La forma más segura de probar los permisos sería intentar acceder al directorio (por ejemplo, hacer un os.listdir) y detectar la excepción.

Además, para que las rutas se interpreten correctamente, debe usar cadenas sin formato o escapar de las barras diagonales inversas ('\\'), o usar barras diagonales en su lugar.

(Edit: se pueden evitar por completo mediante el uso de barras os.path.join - la forma recomendada para construir caminos)

+0

Buena respuesta, pero en su último punto, usar os.path.join u os.path.sep es mejor que crear caminos manualmente –

+0

Funciona perfectamente para mis propósitos. ¡Gracias! – Sean

+0

Es bueno ver que mi propia lucha con los permisos no se ha olvidado :-) – Abgan

5

Mientras os.access hace su mayor esfuerzo para decir si un camino es accesible o no, no lo hace reclamo para ser perfecto. A partir de la documentación de Python:

Nota: operaciones de I/O pueden fallar incluso para el acceso() indica que tendrían éxito, sobre todo para operaciones en sistemas de archivos de red que puede tener permisos semántica más allá de la POSIX habitual permiso-bit modelo.

La forma recomendada de averiguar si el usuario tiene acceso para hacer lo que sea es intentar hacerlo, y detectar las excepciones que se produzcan.

0

En realidad 'C: \ haveaccess' es diferente de r'C: \ haveaccess '. Desde el punto de vista de Python 'C: \ haveaccess' no es una ruta válida, por lo tanto use 'C: \\ haveaccess' en su lugar. Creo que os.access funciona bien.

+0

''C: \ haveaccess'' _es_ una ruta válida porque' \ h' no significa nada especial, por lo que funciona (por pura suerte pero funciona) –

Cuestiones relacionadas