You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python(pysftp)不加载内存从GCS传大Zip至SFTP(非Cloud Function)

问题解答

关于GCS文件的系统路径

不能获取GCS文件的系统路径。GCS是云对象存储服务,gs://开头的路径只是对象的标识,并非本地文件系统的真实路径,所以pysftp.put()无法直接识别这类路径。

可行的传输方法

方法1:流式分块传输(推荐)

通过Google Cloud Storage SDK获取文件的流式对象,分块读取并写入SFTP服务器,全程不会将整个文件加载到内存。

示例代码:

from google.cloud import storage
import pysftp

# 初始化GCS客户端
storage_client = storage.Client()
bucket = storage_client.bucket("你的GCS桶名称")
gcs_blob = bucket.blob("桶内zip文件的路径")

# SFTP连接配置
cnopts = pysftp.CnOpts()
# 生产环境建议保留主机密钥验证,测试环境可临时设置cnopts.hostkeys = None

with pysftp.Connection(host="SFTP服务器地址", username="test", password="test", cnopts=cnopts) as sftp:
    sftp.cwd("/tmp")
    # 打开远程SFTP文件准备写入
    with sftp.open("远程服务器保存的文件名.zip", "wb") as remote_file:
        # 分块传输,chunksize可根据服务器性能调整(示例为10MB)
        gcs_blob.download_to_file(remote_file, chunksize=10 * 1024 * 1024)

方法2:将GCS挂载为本地文件系统

使用gcsfuse工具将GCS桶挂载到本地机器的文件系统,这样就能像操作本地文件一样用pysftp.put()传输。

操作步骤:

  1. 在运行代码的机器上安装gcsfuse
  2. 创建本地挂载目录并挂载GCS桶:
    mkdir ~/gcs-mount
    gcsfuse 你的GCS桶名称 ~/gcs-mount
    
  3. 修改代码使用本地挂载路径:
    with pysftp.Connection(host="SFTP服务器地址", username='test', password='test', cnopts=cnopts) as sftp:
        sftp.cwd("/tmp")
        # 直接使用挂载后的本地路径
        sftp.put("/home/你的用户名/gcs-mount/桶内zip文件的路径")
    

注意:这种方法需要维护挂载的稳定性,且依赖机器上的gcsfuse环境,适合固定机器部署的场景。

内容的提问来源于stack exchange,提问作者PROTOCOL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:54:24