首页 > 解决方案 > Python:pysftp 异常处理

问题描述

我正在使用 pysftp 和 Python 3.7 来设置 SFTP 客户端脚本。

我的代码(简化和最小化):

import pysftp
import sys

# Variables
destination_dir = 'BOGUS_DIR'
server = 'myserver.mydomain.com'
user = 'my_user'
key = 'my_key'
port = 22

# cnopts
mycnopts = pysftp.CnOpts()
mycnopts.log = True
mycnopts.compression = True
mycnopts.ciphers = None
mycnopts.hostkeys = None

try:
    with pysftp.Connection(server, username=user, private_key=key, port=port, cnopts=mycnopts) as sftp:
        try:
            with sftp.cd(destination_dir):
                print("OK cd worked")
        except:
            print("NOT OK cd failed")
            e = sys.exc_info()
            print("Exception: {0}".format(e))

        if sftp.isdir(destination_dir):
            print("OK isdir")
        else:
            print("NOT OK isdir")

except:
    print("Connection failure.")
    e = sys.exc_info()
    print("Exception: {0}".format(e))

输出是:OK cd 工作

BOGUS_DIR但我知道一个不存在的事实。就像 pysftp 没有引发异常cd(),或者我抓错了(因此我的 python 代码没有正确完成)。

同样isdir(),无论我作为参数输入什么,True即使目录不存在,它也总是返回。

如果我因错误而更改连接参数,我会捕获连接失败异常。

pyftp 处理异常是错误的,还是我的代码有问题?我应该不信任 pysftp 并直接使用 Paramiko 吗?

标签: pythonpysftp

解决方案


好吧,我想通了。

sftp.cd()如果目录不存在,则不会引发异常。只有对坏目录的操作才可以。因此,如果我像这样修改我的代码:

....
    try:
        with sftp.cd(destination_dir):
            sftp.listdir()
            print("OK ce worked")
    except:
        print("NOT OK cd failed")
        e = sys.exc_info()
        print("Exception: {0}".format(e))  

....

这样我得到一个异常,因为sftp.listdir()无法使用不存在的目录。

除了设置当前目录的值之外,几乎sftp.cd没有做任何事情,实际上没有对它做任何事情。


推荐阅读