¿Cuál sería la mejor manera en Python de determinar si un directorio es escribible para el usuario que ejecuta el script? Dado que esto probablemente involucrará el uso del módulo del sistema operativo, debo mencionar que lo estoy ejecutando en un entorno * nix.
python
file
permissions
directory
operating-system
tigre iluminado
fuente
fuente
os.access()
es que verifica utilizando el UID y GID reales , no los efectivos . Esto podría causar rarezas en entornos SUID / SGID. ('pero el script ejecuta setuid root, ¿por qué no puede escribir en el archivo?')os.access(dirpath, os.W_OK | os.X_OK)
devuelve True incluso si no tengo acceso de escritura.Puede parecer extraño sugerir esto, pero un modismo común de Python es
Siguiendo ese modismo, se podría decir:
Intente escribir en el directorio en cuestión y detecte el error si no tiene permiso para hacerlo.
fuente
except: pass
, de esta manera siempre puedes ser optimista y pensar muy bien en ti mismo. / sarcasmo fuera. Ahora, ¿por qué querría, por ejemplo, intentar escribir algo en cada directorio de mi sistema de archivos, para producir una lista de ubicaciones grabables?Mi solución usando el
tempfile
módulo:Actualización: después de probar el código nuevamente en Windows, veo que, de hecho, hay un problema al usar el archivo temporal allí, consulte el problema 22107: el módulo del archivo temporal malinterpreta el error de acceso denegado en Windows . En el caso de un directorio que no se puede escribir, el código se cuelga durante varios segundos y finalmente arroja un
IOError: [Errno 17] No usable temporary file name found
. ¿Quizás esto es lo que estaba observando user2171842? Desafortunadamente, el problema no está resuelto por ahora, por lo que para manejarlo, el error también debe detectarse:El retraso, por supuesto, todavía está presente en estos casos.
fuente
tempfile
. solo funciona cuando no hay ningúnOSError
significado que tenga permiso para escribir / borrar. de lo contrario, no lo haráreturn False
porque no se devuelve ningún error y el script no continuará ejecutándose o saliendo. no se devuelve nada. simplemente está atascado en esa línea. sin embargo, la creación de un archivo no temporal como la respuesta de khattam funciona tanto cuando se permite como se deniega el permiso. ¿ayuda?Tropecé con este hilo buscando ejemplos para alguien. Primer resultado en Google, ¡felicidades!
La gente habla sobre la forma Pythonic de hacerlo en este hilo, pero ¿no hay ejemplos de código simples? Aquí tiene, para cualquier otra persona que se tropiece:
Esto intenta abrir un identificador de archivo para escritura y sale con un error si no se puede escribir en el archivo especificado: Esto es mucho más fácil de leer y es una forma mucho mejor de hacerlo en lugar de realizar comprobaciones previas en la ruta del archivo o el directorio. , ya que evita las condiciones de carrera; casos en los que el archivo no se puede escribir entre el momento en que ejecuta la comprobación previa y cuando realmente intenta escribir en el archivo.
fuente
Si solo te preocupan los permisos de archivo,
os.access(path, os.W_OK)
debes hacer lo que pidas. Si, en cambio, desea saber si puede escribir en el directorio,open()
un archivo de prueba para escribir (no debería existir de antemano), capturar y examinar algunoIOError
, y limpiar el archivo de prueba después.De manera más general, para evitar ataques TOCTOU (solo un problema si su script se ejecuta con privilegios elevados, suid o cgi o algo así), no debe confiar realmente en estas pruebas anticipadas, pero elimine los privilegios, haga
open()
y espere elIOError
.fuente
Compruebe los bits de modo:
fuente
Aquí hay algo que creé basado en la respuesta de ChristopheD:
fuente
más información sobre el acceso se puede encontrar aquí
fuente
Me encontré con esta misma necesidad al agregar un argumento a través de argparse. El integrado
type=FileType('w')
no funcionaría para mí ya que estaba buscando un directorio. Terminé escribiendo mi propio método para resolver mi problema. Aquí está el resultado con el fragmento argparse.Eso resulta en lo siguiente:
Regresé y agregué print opts.dir hasta el final, y todo parece estar funcionando como lo deseaba.
fuente
Si necesita verificar el permiso de otro usuario (sí, me doy cuenta de que esto contradice la pregunta, pero puede ser útil para alguien), puede hacerlo a través del
pwd
módulo y los bits de modo del directorio.Descargo de responsabilidad : no funciona en Windows, ya que no usa el modelo de permisos POSIX (y el
pwd
módulo no está disponible allí), por ejemplo: solución solo para sistemas * nix.Tenga en cuenta que un directorio debe tener todos los 3 bits establecidos: lectura, escritura y eXecute.
Ok, R no es una necesidad absoluta, pero sin ella no puede enumerar las entradas en el directorio (por lo que debe saber sus nombres). Por otro lado, ejecutar es absolutamente necesario, sin que el usuario no pueda leer los inodos del archivo; por lo que incluso teniendo W, sin X, los archivos no se pueden crear ni modificar. Explicación más detallada en este enlace.
Finalmente, los modos están disponibles en el
stat
módulo, sus descripciones están en inode (7) man .Código de muestra cómo verificar:
fuente