Question

SFTPClient apparemment ne dispose pas d'un exists méthode. Ceci est mon implémentation actuelle:

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

Y at-il une meilleure façon de le faire? Vérification de la sous-chaîne dans les messages d'exception est assez laid et peut être peu fiable.

Était-ce utile?

La solution

Voir le module pour les constantes errno définissant toutes les erreurs codes. En outre, il est un peu plus clair d'utiliser l'attribut de l'__init__ exception que l'expansion des args <=>, donc je ferais ceci:

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

Autres conseils

Il n'y a pas « existe » méthode définie pour SFTP (non seulement paramiko), de sorte que votre méthode est très bien.

Je pense que la vérification de la errno est un peu plus propre:

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 soulève littéralement FileNotFoundError

def sftp_exists(sftp, path):
    try:
        sftp.stat(path)
        return True
    except FileNotFoundError:
        return False
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top