Check whether a path exists on a remote host using paramiko
Question
Paramiko's SFTPClient apparently does not have an exists
method. This is my current implementation:
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
Is there a better way to do this? Checking for substring in Exception messages is pretty ugly and can be unreliable.
Solution
See the errno
module for constants defining all those error codes. Also, it's a bit clearer to use the errno
attribute of the exception than the expansion of the __init__
args, so I'd do this:
except IOError, e: # or "as" if you're using Python 3.0
if e.errno == errno.ENOENT:
...
OTHER TIPS
There is no "exists" method defined for SFTP (not just paramiko), so your method is fine.
I think checking the errno is a little cleaner:
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 literally raises FileNotFoundError
def sftp_exists(sftp, path):
try:
sftp.stat(path)
return True
except FileNotFoundError:
return False
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow