Python: pysftp异常处理

Python: pysftp exception handling

我正在使用带有 Python 3.7 的 pysftp 来设置 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 worked

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

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

如果我因为某些错误而更改了我的连接参数,我会捕捉到连接失败异常。

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

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

好的,我想我明白了。

如果目录不存在,

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 除了设置当前目录的值之外什么都不做,实际上没有对它做任何事情。