Pergunta

paramiko do SFTPClient aparentemente não tem um método exists. Esta é a minha implementação atual:

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

Existe uma maneira melhor de fazer isso? Verificação de substring em mensagens de exceção é muito feio e pode não ser confiável.

Foi útil?

Solução

Veja a errno módulo para constantes que definem todos os códigos de erro. Além disso, é um pouco mais clara de usar o atributo errno da exceção do que a expansão das args __init__, então eu faria isso:

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

Outras dicas

Não há "existe" método definido para SFTP (não apenas paramiko), para que o seu método é muito bem.

Eu acho que a verificação do errno é um pouco mais limpo:

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

paramiko literalmente levanta FileNotFoundError

def sftp_exists(sftp, path):
    try:
        sftp.stat(path)
        return True
    except FileNotFoundError:
        return False
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top