2009-05-12 3 views
12

existiert Paramiko SFTPClient hat offenbar keine exists Methode. Dies ist meine aktuelle Implementierung:Überprüfen Sie, ob ein Pfad auf einem Remote-Host mit 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 

Gibt es einen besseren Weg, dies zu tun? Die Überprüfung auf Teilstrings in Exception-Nachrichten ist ziemlich hässlich und kann unzuverlässig sein.

Antwort

18

die errno module für Konstanten Siehe die Definition alle diese Fehlercodes. Außerdem ist es ein bisschen klarer das errno Attribut der Ausnahme als die Ausdehnung des __init__ args zu verwenden, so würde ich dies tun:

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

Dies ist wahrscheinlich der richtige Weg, weil stat zu tun() auf einem nicht Die vorhandene Datei auf einem SFTP-Server über Paramiko löst diese spezielle Ausnahme mit dem Fehlernummer errno.ENOENT aus: https://github.com/paramiko/paramiko/blob/master/paramiko/sftp_client.py#L722 – Devy

7

Es gibt keine "existiert" -Methode für SFTP (nicht nur Paramiko), so dass Ihre Methode in Ordnung ist.

Ich denke, die errno Überprüfung ist ein wenig sauberer:

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