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

3 投票
2 回答
6112 浏览
提问于 2025-04-18 06:37

我查了一下这个错误,但找到的都是和 Python 3.3 相关的类似不匹配错误。我最开始在尝试用 *.txt 通配符把本地路径下的所有文件传到远程路径时,老是出现“文件不存在”的错误……所以我最后试着只用一个文件,结果得到了这个错误:

大小不匹配!0 != 14911

下面是我的代码,还有一些 Python 的信息,我是在 Linux Mint 13 Maya 上运行的。我对 Python 和这个模块都很陌生,编程也刚刚入门。所以别指望我能懂你在说什么……=P

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

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

这个问题可能是因为你的文件系统和远程文件系统之间的同步问题,就像在关于Paramiko的get函数的类似问题中所描述的那样,具体可以查看这里

由于pysftp是Paramiko的一个封装,所以你收到的错误信息是由Paramiko引擎抛出的,我猜具体是在Paramiko的sftp_client.py文件的722行,代码是raise IOError(

    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行找到),以便相应地更改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函数时遇到的问题那样解决你的问题,我会非常感兴趣听到你的反馈。

此外,下次你遇到问题时,最好也把完整的错误信息发出来,这样可以更准确地检查问题出在哪里。

1

ymonad说得对,pysftp确实在按照要求返回目录项的大小。

你说得没错,目前pysftp并不支持递归复制目录。不过,关于这个功能在跟踪系统中有一个问题,所以你可以为它投票。

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

或者你可以自己动手实现这个功能,然后提交一个请求!

撰写回答