2009-05-12 6 views
12

La méthode SFTPClient de Paramiko n'a apparemment pas de méthode exists. Ceci est ma mise en œuvre actuelle:Vérifier si un chemin existe sur un hôte distant à l'aide de 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 

Y a-t-il une meilleure façon de le faire? La vérification de la sous-chaîne dans les messages d'exception est très laide et peut ne pas être fiable.

Répondre

18

Voir la errno module pour les constantes définissant tous les codes d'erreur. En outre, il est un peu plus clair d'utiliser l'attribut errno de l'exception que l'expansion des __init__ args, donc je ferais ceci:

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

Ceci est probablement la bonne façon de faire parce que stat() sur une base non fichier existant sur un serveur SFTP via Paramiko soulèvera cette exception particulière avec le code d'erreur errno.ENOENT: https://github.com/paramiko/paramiko/blob/master/paramiko/sftp_client.py#L722 – Devy

7

Il n'existe aucune méthode "exists" définie pour SFTP (pas simplement paramiko), donc votre méthode est correcte.

Je pense que la vérification de la errno est un peu plus propre:

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 
Questions connexes