我正在使用 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
提交
取消