尽管文件已上传,但 Python pysftp.put 会引发“没有此类文件”异常

Ami*_*are 2 python sftp pysftp

我正在使用 pysftp 连接到服务器并向其上传文件。

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
self.sftp = pysftp.Connection(host=self.serverConnectionAuth['host'], port=self.serverConnectionAuth['port'],
                              username=self.serverConnectionAuth['username'], password=self.serverConnectionAuth['password'], 
                              cnopts=cnopts)
self.sftp.put(localpath=self.filepath+filename, remotepath=filename)
Run Code Online (Sandbox Code Playgroud)

有时它没有错误,但有时它会正确放置文件,但会引发以下异常。该文件由服务器上运行的另一个程序读取和处理,因此我可以看到该文件在那里并且没有损坏

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
self.sftp = pysftp.Connection(host=self.serverConnectionAuth['host'], port=self.serverConnectionAuth['port'],
                              username=self.serverConnectionAuth['username'], password=self.serverConnectionAuth['password'], 
                              cnopts=cnopts)
self.sftp.put(localpath=self.filepath+filename, remotepath=filename)
Run Code Online (Sandbox Code Playgroud)

我怎样才能防止异常?

Mar*_*ryl 9

根据所描述的行为,我假设该文件在由某个服务器端进程上传后很快就会被删除。

默认情况下pysftp.Connection.put,通过检查目标文件的大小来验证上传。如果服务器端进程设法过快地删除文件,则读取文件大小将失败。

您可以通过将confirm参数设置为False以下来禁用上传后检查:

self.sftp.put(localpath=self.filepath+filename, remotepath=filename, confirm=False)
Run Code Online (Sandbox Code Playgroud)

我相信无论如何检查都是多余的,请参阅
如何在 SFTP 文件传输期间执行校验和以确保数据完整性?


有关 Paramiko(pysftp 在内部使用)的类似问题,请参阅:
Paramiko put method throws "[Errno 2] File not found" if SFTP server has trigger to automatic move file on upload