Проверьте, существует ли путь на удаленном хосте, используя paramiko

SFTPClient Paramiko, по-видимому, не имеет метода 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

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


person Sridhar Ratnakumar    schedule 12.05.2009    source источник


Ответы (3)


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

except IOError, e: # or "as" if you're using Python 3.0
  if e.errno == errno.ENOENT:
    ...
person Matt Good    schedule 08.09.2009
comment
Это, вероятно, правильный способ сделать, потому что stat() для несуществующего файла на SFTP-сервере через Paramiko вызовет это конкретное исключение с кодом ошибки errno.ENOENT: github.com/paramiko/paramiko/blob/master/paramiko/ - person Devy; 17.06.2014

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

def sftp_exists(sftp, path):
    try:
        sftp.stat(path)
        return True
    except FileNotFoundError:
        return False
person jslay    schedule 05.01.2019
comment
На самом деле это FileNotFoundError (из встроенных классов исключений) ETA: поставил в очередь редактирование этого ответа, чтобы изменить его. - person Josephine Moeller; 10.05.2019

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

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

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
person JimB    schedule 12.05.2009