Проверьте, существует ли путь на удаленном хосте, используя paramiko - PullRequest
13 голосов
/ 12 мая 2009

Paramiko SFTPClient , по-видимому, не имеет exists метода. Это моя текущая реализация:

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

Есть ли лучший способ сделать это? Проверка подстроки в сообщениях об исключениях довольно уродлива и может быть ненадежной.

Ответы [ 3 ]

18 голосов
/ 08 сентября 2009

См. errno модуль для констант, определяющих все эти коды ошибок. Кроме того, немного понятнее использовать атрибут исключения errno, чем расширение аргументов __init__, поэтому я бы сделал это:

except IOError, e: # or "as" if you're using Python 3.0
  if e.errno == errno.ENOENT:
    ...
7 голосов
/ 12 мая 2009

Не существует метода «существует», определенного для SFTP (не только paramiko), поэтому ваш метод в порядке.

Я думаю, что проверка ошибки немного чище:

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
1 голос
/ 06 января 2019

Парамико буквально поднимает FileNotFoundError

def sftp_exists(sftp, path):
    try:
        sftp.stat(path)
        return True
    except FileNotFoundError:
        return False
...