pysftp 上传错误 "大小不匹配! 0 != 14911
我查了一下这个错误,但找到的都是和 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 个回答
这个问题可能是因为你的文件系统和远程文件系统之间的同步问题,就像在关于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函数时遇到的问题那样解决你的问题,我会非常感兴趣听到你的反馈。
此外,下次你遇到问题时,最好也把完整的错误信息发出来,这样可以更准确地检查问题出在哪里。
ymonad说得对,pysftp确实在按照要求返回目录项的大小。
你说得没错,目前pysftp并不支持递归复制目录。不过,关于这个功能在跟踪系统中有一个问题,所以你可以为它投票。
https://bitbucket.org/dundeemt/pysftp/issue/10/remote-walkdirs
或者你可以自己动手实现这个功能,然后提交一个请求!