我正在使用 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没有做任何事情,实际上没有对它做任何事情。
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
如果目录不存在,您会从尝试运行命令的远程 shell 收到错误。在此代码中,您试图捕获只能由sftp
. sftp
也许,您应该在每个执行的 shell 命令后检查模块应返回的状态码
添加回答
举报
0/150
提交
取消