2009-05-12 10 views
12

Paramiko na SFTPClient najwyraźniej nie ma metody exists. To jest moja obecna implementacja:Sprawdź, czy ścieżka na zdalnym hoście za pomocą 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 

Czy jest lepszy sposób to zrobić? Sprawdzanie podłańcucha w komunikatach o wyjątkach jest dość brzydkie i może być niewiarygodne.

Odpowiedz

18

Zobacz errno module dla stałych określających te wszystkie kody błędów. Ponadto, jest to nieco jaśniejsze użyć atrybutu wyjątku niż ekspansji __init__ args errno, tak bym to zrobić:

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

Prawdopodobnie jest to dobry sposób, żeby zrobić ponieważ stat() w sposób wolny istniejący plik na serwerze SFTP za pośrednictwem Paramiko podniesie ten wyjątek z kodem błędu errno.ENOENT: https://github.com/paramiko/paramiko/blob/master/paramiko/sftp_client.py#L722 – Devy

7

Nie istnieje żadna "metoda" zdefiniowana dla SFTP (nie tylko paramiko), więc twoja metoda jest w porządku.

myślę sprawdzenie errno jest trochę czystsze:

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