尽管文件已上传,但python pysftp.put引发“无此文件”异常


问题内容

我正在使用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)

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

  File "E:\Anaconda\envs\py35\lib\site-packages\pysftp\__init__.py", line 364, in put
    confirm=confirm)
  File "E:\Anaconda\envs\py35\lib\site-packages\paramiko\sftp_client.py", line 727, in put
    return self.putfo(fl, remotepath, file_size, callback, confirm)
  File "E:\Anaconda\envs\py35\lib\site-packages\paramiko\sftp_client.py", line 689, in putfo
    s = self.stat(remotepath)
  File "E:\Anaconda\envs\py35\lib\site-packages\paramiko\sftp_client.py", line 460, in stat
    t, msg = self._request(CMD_STAT, path)
  File "E:\Anaconda\envs\py35\lib\site-packages\paramiko\sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "E:\Anaconda\envs\py35\lib\site-packages\paramiko\sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "E:\Anaconda\envs\py35\lib\site-packages\paramiko\sftp_client.py", line 861, in _convert_status
    raise IOError(errno.ENOENT, text)
FileNotFoundError: [Errno 2] No such file

如何防止该异常?


问题答案:

根据所描述的行为,我假设文件由某些服务器端进程上传后不久就被删除了。

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

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

self.sftp.put(localpath=self.filepath+filename, remotepath=filename, confirm=False)

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


有关Paramiko(pysftp在内部使用)的类似问题,请参见:如果SFTP服务器已触发在上传时自动移动文件,则Paramiko的
[put方法将引发“ [Errno 2]文件未找到””