我正在使用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
如何防止出现异常?
2条答案
按热度按时间wljmcqd81#
根据所描述的行为,我假设文件在被某个服务器端进程上传后不久就被删除了。
默认情况下,
pysftp.Connection.put
通过检查目标文件的大小来验证上传。如果服务器端进程设法过快地删除文件,则阅读文件大小将失败。您可以通过将
confirm
参数设置为False
来禁用上传后检查:我相信支票是多余的
How to perform checksums during a SFTP file transfer for data integrity?
有关Paramiko(pysftp内部使用)的类似问题,请参阅:
Paramiko put method throws "[Errno 2] File not found" if SFTP server has trigger to automatically move file upon upload
xkftehaa2#
也有这个问题的文件自动得到移动之前,paramiko可以做一个
os.stat
的上传文件,并比较本地和上传的文件大小。@Martin_Prikryl解决方案在使用
sftp.put
或sftp.putfo
时通过传入confirm=False
来消 debugging 误,效果良好如果您希望此检查仍然运行,以验证文件已完全上载,您可以沿着以下命令。为此,您需要知道移动的文件位置并能够读取文件。
两种检查都使用
os.stat