为了账号安全,请及时绑定邮箱和手机立即绑定

Python:pysftp 异常处理

Python:pysftp 异常处理

凤凰求蛊 2022-10-11 21:37:57
我正在使用 pysftp 和 Python 3.7 来设置 SFTP 客户端脚本。我的代码(简化和最小化):import pysftpimport sys# Variablesdestination_dir = 'BOGUS_DIR'server = 'myserver.mydomain.com'user = 'my_user'key = 'my_key'port = 22# cnoptsmycnopts = pysftp.CnOpts()mycnopts.log = Truemycnopts.compression = Truemycnopts.ciphers = Nonemycnopts.hostkeys = Nonetry:    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 吗?
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

好吧,我想通了。


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没有做任何事情,实际上没有对它做任何事情。


查看完整回答
反对 回复 2022-10-11
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

如果目录不存在,您会从尝试运行命令的远程 shell 收到错误。在此代码中,您试图捕获只能由sftpsftp也许,您应该在每个执行的 shell 命令后检查模块应返回的状态码



查看完整回答
反对 回复 2022-10-11
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信