pysftp和paramiko几秒后停止上传文件

2 投票
1 回答
2877 浏览
提问于 2025-04-18 15:49

我正在使用 Python 3.4 和 pysftp(怀疑 pysftp 在 3.4 上可以正常工作)。

pysftp 是一个封装了 paramiko 的工具。

我下载文件没有问题。

我也可以上传小文件。

但是,当我上传需要几秒钟以上才能完成的文件时,就会出现错误。我监控了我的网络连接,发现大约 3 秒后就没有继续上传了。

大约 5 分钟后,我收到了一个 EOFError 的错误。

我也试过使用 paramiko 模块,结果是一样的。

我可以使用 open ssh 和 filezilla 上传文件,没有任何问题。

with pysftp.Connection(host="host",username="python",
    password="pass",port=2222) as srv:
    print('server connected')

    srv.put(file_name)

我希望能够上传大于几 KB 的文件……我缺少了什么呢?

1 个回答

5

看起来在上传文件时,paramiko没有自动调整窗口大小。你可以手动增加窗口大小:

with pysftp.Connection(host="host",username="python",
    password="pass",port=2222) as srv:
    print('server connected')

    channel = srv.sftp_client.get_channel()
    channel.lock.acquire()
    channel.out_window_size += os.stat(file_name).st_size
    channel.out_buffer_cv.notifyAll()
    channel.lock.release()
    srv.put(file_name)

这个方法对我有效,但有时候对于大文件来说,这个调整可能还不够,所以我会再加一些额外的字节。我觉得可能会有一些数据包丢失,这也和网络连接有关。

撰写回答