es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Solo maneja OSError Errno 13 (permiso denegado) en python

Estoy migrando una aplicación a python3 pero hay sistemas heredados que aún no se pueden actualizar y están utilizando python2.

Tengo la aplicación que necesita actualizar un archivo de caché, pero si por alguna razón el usuario que ejecuta la aplicación no puede leer/actualizar la caché, no hay problema y simplemente puede consultar la base de datos en lugar de utilizar la caché.

Por lo tanto, me gustaría pasar la excepción de permiso denegado en python2, que es un OSError [Errno 13]. En python3 uso PermissionError, así que eso está bien. Supongo que esta excepción solo capturará Errno 13.

Esto es lo que tengo en python3:

for filename in os.listdir(cache_dir):
    try:
        if filename.endswith('.cache'):
            os.remove(os.path.join(cache_dir, filename))
    except PermissionError:
        pass
    except OSError:
        # Manejar todos los demás errores

¿Cómo puedo hacer lo mismo en python2 para que solo se “pase” el Errno 13 y nada más? Por ejemplo, puedo pasar si es un permiso denegado pero no si el sistema de archivos es de solo lectura o el disco está lleno.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el mismo comportamiento en Python 2, puedes capturar el específico OSError con un mensaje que indique que el error está relacionado con un permiso denegado. Aquí tienes un fragmento de código de ejemplo que debería funcionar:

    import os
    
    cache_dir = "/ruta/al/directorio/cache"
    
    for filename in os.listdir(cache_dir):
        try:
            if filename.endswith('.cache'):
                os.remove(os.path.join(cache_dir, filename))
        except OSError as e:
            if "Permiso denegado" in str(e) and e.errno == 13:
                # Manejar el error de permiso denegado
                pass
            else:
                # Manejar todos los demás errores
                pass
    

    Esto capturará el específico OSError con el errno 13 y el mensaje “Permiso denegado”, mientras permite que todos los demás errores del sistema operativo se manejen por separado.

Comments are closed.