使用paramiko检查远程主机上是否存在路径

18 投票
3 回答
28258 浏览
提问于 2025-04-15 11:31

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 个回答

6

对于SFTP(不仅仅是paramiko),并没有定义“exists”这个方法,所以你用的方法是可以的。

我觉得检查错误号(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
10

Paramiko 这个库实际上会抛出一个叫做 FileNotFoundError 的错误。

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

可以查看errno模块,里面定义了所有这些错误代码的常量。而且,使用异常的errno属性比展开__init__参数要更清晰,所以我会这样做:

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

撰写回答