2009-05-12 18 views
12

Paramiko SFTPClient aparentemente no tiene un método exists. Esta es mi implementación actual:Compruebe si existe una ruta en un host remoto utilizando paramiko

def rexists(sftp, path): 
    """os.path.exists for paramiko's SCP object 
    """ 
    try: 
     sftp.stat(path) 
    except IOError, e: 
     if 'No such file' in str(e): 
      return False 
     raise 
    else: 
     return True 

¿Hay una mejor manera de hacerlo? Comprobar la subcadena en los mensajes de excepción es bastante feo y puede no ser confiable.

Respuesta

18

Véase el errno module para las constantes que definen todos los códigos de error. Además, es un poco más claro utilizar el atributo errno de la excepción que la expansión de los __init__ args, así que me gustaría hacer esto:

except IOError, e: # or "as" if you're using Python 3.0 
    if e.errno == errno.ENOENT: 
    ... 
+0

Esta es probablemente la forma correcta de hacerlo debido a stat() de forma no el archivo existente en un servidor SFTP a través de Paramiko elevará esta excepción particular con el código de error errno.ENOENT: https://github.com/paramiko/paramiko/blob/master/paramiko/sftp_client.py#L722 – Devy

7

No existe un método "existente" definido para SFTP (no solo paramiko), por lo que su método está bien.

creo que el control de la errno es un poco más limpio:

def rexists(sftp, path): 
    """os.path.exists for paramiko's SCP object 
    """ 
    try: 
     sftp.stat(path) 
    except IOError, e: 
     if e[0] == 2: 
      return False 
     raise 
    else: 
     return True 
Cuestiones relacionadas