pysftp放错误"大小不匹配! 0!= 14911"

时间:2014-05-15 00:41:45

标签: python pysftp

我四处寻找这个错误,但我真正找到的是python 3.3支持的类似不匹配错误。我最初在尝试使用* .txt通配符将本地路径中的所有文件放到remotepath时遇到错误,保持获取文件不存在错误...所以我最后只用一个文件尝试了这个,并得到了这个:

大小不匹配! 0!= 14911

这是代码,以及运行linux mint 13 maya的python信息。我是python和这个模块的新手,也是编程时期的新手。所以不要以为我知道你在说什么...... = P

Python 2.7.3(默认,2012年4月20日,22:39:59) linux2上的[GCC 4.6.3]

import pysftp as sftp


def putjob():
    try:
        s = sftp.Connection(host='secure.sftp.site', username='username', password='password')

        remotepath='/Home/xxx24659/Upload/'
        localpath='/home/xxx24659/Local/Upload/Q0001.txt'
        s.put(localpath,remotepath)

        s.close()

    except Exception, e:
        print str(e)

putjob()

2 个答案:

答案 0 :(得分:1)

ymonad说得对,pysftp按要求返回了目录条目的大小。

你是对的,pysftp当前没有进行递归目录复制。但是,在跟踪器中存在问题,因此您可以投票支持它。

https://bitbucket.org/dundeemt/pysftp/issue/10/remote-walkdirs

或自己滚动并发送拉取请求!

答案 1 :(得分:0)

该问题可能是由于文件系统和远程文件系统之间的同步性问题引起的,如关于Paramiko获取功能here的类似问题所述。

由于pysftp是一个Paramiko包装器,因此您收到的错误消息是由Paramiko引擎抛出的,我想特别是在Paramiko sftp_client.py raise IOError(的第722行:

    with self.file(remotepath, "wb") as fr:
        fr.set_pipelined(True)
        size = self._transfer_with_callback(
            reader=fl, writer=fr, file_size=file_size, callback=callback
        )
    if confirm:
        s = self.stat(remotepath)
        if s.st_size != size:
            raise IOError(
                "size mismatch in put!  {} != {}".format(s.st_size, size)
            )
    else:
        s = SFTPAttributes()
    return s

要解决此问题,我猜想您必须在文件处理中通过实现Paramiko putfo函数中的tell函数来获取文件大小(在第687行的here中进行查找)为了相应地更改pysftp使用的基础Paramiko代码:

with self.file(remotepath, "wb") as fr:
    fr.set_pipelined(True)
    remotesize = fr.tell()
    size = self._transfer_with_callback(
        reader=fl, writer=fr, file_size=file_size, callback=callback
    )
if confirm:
    if remotesize != size:
        raise IOError(
            "size mismatch in put!  {} != {}".format(remotesize, size)
        )
else:
    s = SFTPAttributes()
return s

如果我的建议能够像解决Paramiko get函数那样为我解决您的问题,我将非常感兴趣。

此外,下次遇到问题时,也可以发布整个错误消息以检查其具体来源,这将是有益的。