Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;IOError:get中的大小不匹配&引用;通过SFTP检索文件时_Python_Paramiko_Pysftp - Fatal编程技术网

Python &引用;IOError:get中的大小不匹配&引用;通过SFTP检索文件时

Python &引用;IOError:get中的大小不匹配&引用;通过SFTP检索文件时,python,paramiko,pysftp,Python,Paramiko,Pysftp,我有一个脚本,我使用它定期通过SFTP检索特定文件。有时,脚本会出现以下输出错误: Traceback (most recent call last): File "ETL.py", line 304, in <module> get_all_files(startdate, enddate, "vma" + foldernumber + "/logs/", txtype[1] + single_date2 + ".log", txtype[2] + foldernu

我有一个脚本,我使用它定期通过SFTP检索特定文件。有时,脚本会出现以下输出错误:

Traceback (most recent call last):
  File "ETL.py", line 304, in <module>
    get_all_files(startdate, enddate, "vma" + 
foldernumber + "/logs/", txtype[1] + single_date2 + ".log", txtype[2] + 
foldernumber + "\\", sftp)
  File "ETL.py", line 283, in get_all_files
    sftp.get(sftp_dir + filename, local_dir + filename)
  File "C:\Python27\lib\site-packages\pysftp\__init__.py", line 249, in get
    self._sftp.get(remotepath, localpath, callback=callback)
  File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 806, in get
    "size mismatch in get!  {} != {}".format(s.st_size, size)
IOError: size mismatch in get!  950272 != 1018742

我希望检索所有可下载的文件时不会产生此错误。

错误消息
IOError:get中的大小不匹配!950272 != 如果本地目录上复制的文件的大小与远程文件的预取大小不匹配,则的get函数将引发1018742

with open(localpath, "wb") as fl:
    size = self.getfo(remotepath, fl, callback)
s = os.stat(localpath)
if s.st_size != size:
    raise IOError(
        "size mismatch in get!  {} != {}".format(s.st_size, size)
    )
如果连接和传输过程没有问题,为什么会发生这种情况?

在检查Paramiko代码并试图调试此问题时,我的本地文件系统的一个奇怪行为引起了我的注意。对于从远程文件系统复制的每个文件,本地文件系统都会花一些时间处理注册了正确文件大小的文件

这种行为导致我假设,虽然Paramiko库的get函数正确处理文件,但它不会等待本地文件系统进行调整,因此可能会在getfo函数使用
s=os.stat处理完文件后立即获取本地文件的状态(包括大小)(本地路径)

这可能导致本地文件大小与正确预取的远程文件大小不一致,因此可能引发IOError
“get!{}!={}中的大小不匹配”。格式(s.st_size,size)

它还将解释为什么不能一致地再现错误,因为Python解释器总是在本地操作系统的同步性方面与不同的环境一起工作

我是如何为自己解决这个问题的?

我操作了get函数的Paramiko代码,该代码可以在“sftp_client.py”的第785行找到,并在文件处理中添加了
localsize=fl.tell()
,相应地更新大小检查:

with open(localpath, "wb") as fl:
    size = self.getfo(remotepath, fl, callback)
    localsize = fl.tell()
if localsize != size:
    raise IOError(
        "size mismatch  {} != {}".format(localsize, size)
    )

这应该可以避免有缺陷的本地文件大小检查
s=os.stat(localpath)
将其替换为正常工作的,在文件处理期间使用file对象获取本地文件的大小。

如果本地目录上复制的文件的大小与预取的大小不匹配,则get!950272!=1018742中的错误消息
IOError:size mismatch in get!950272!
将由的get函数抛出远程文件的名称:

with open(localpath, "wb") as fl:
    size = self.getfo(remotepath, fl, callback)
s = os.stat(localpath)
if s.st_size != size:
    raise IOError(
        "size mismatch in get!  {} != {}".format(s.st_size, size)
    )
如果连接和传输过程没有问题,为什么会发生这种情况?

在检查Paramiko代码并试图调试此问题时,我的本地文件系统的一个奇怪行为引起了我的注意。对于从远程文件系统复制的每个文件,本地文件系统都花了一些时间处理注册了正确文件大小的文件

这种行为导致我假设,虽然Paramiko库的get函数正确处理文件,但它不会等待本地文件系统进行调整,因此可能会在getfo函数使用
s=os.stat处理完文件后立即获取本地文件的状态(包括大小)(本地路径)

这可能导致本地文件大小与正确预取的远程文件大小不一致,因此可能引发IOError
“get!{}!={}中的大小不匹配”。格式(s.st_size,size)

它还将解释为什么不能一致地再现错误,因为Python解释器总是在本地操作系统的同步性方面与不同的环境一起工作

我是如何为自己解决这个问题的?

我操作了get函数的Paramiko代码,该代码可以在“sftp_client.py”的第785行找到,并在文件处理中添加了
localsize=fl.tell()
,相应地更新大小检查:

with open(localpath, "wb") as fl:
    size = self.getfo(remotepath, fl, callback)
    localsize = fl.tell()
if localsize != size:
    raise IOError(
        "size mismatch  {} != {}".format(localsize, size)
    )
这应该可以避免有缺陷的本地文件大小检查
s=os.stat(localpath)
将其替换为在文件处理期间使用file对象获取本地文件大小的正常工作的检查