2

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

尺寸不匹配!0 != 14911

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

linux2 上的 Python 2.7.3(默认,2012 年 4 月 20 日,22:39:59)[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()
4

2 回答 2

1

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

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

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

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

于 2014-05-15T17:44:43.367 回答
0

该问题可能是由于您的文件系统和远程文件系统之间的同步问题引起的,如此处关于 Paramiko get-function 的类似问题所述

由于 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 行可以找到以更改底层 Paramiko -pysftp 相应使用的代码:

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-function 所做的那样,我将非常有兴趣收到您的来信。

此外,下次您遇到问题时,也可以发布整个错误消息以检查它的具体来源。

于 2020-11-26T12:41:09.223 回答