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

GCP部署Cloud Function时Numpy依赖安装失败问题排查

问题根因
  • 构建报错核心是依赖版本和Python运行时不兼容,触发C扩展编译失败。从报错路径可以确认你当前用的是Python 3.9运行时,你固定的pandas==1.0.3是2020年的老版本,根本没有提供Python 3.9对应的预编译wheel包;你手动加的numpy==1.23.0没有解决问题,因为pip构建时会为老版本pandas拉取适配的numpy源码编译,而这部分老C代码用了Python 3.9已经废弃移除的Unicode相关接口,直接导致gcc编译退出。另外Cloud Shell里预装的numpy和Cloud Functions的构建容器完全隔离,不会复用到构建环境,你在Cloud Shell里检查包版本没有任何参考意义。
  • 就算依赖安装成功,你的代码逻辑也跑不通:glob.glob只能遍历本地文件系统,识别不了gs://开头的GCS对象路径;最后output_df.to_csv("NAME.csv")只会把文件写到函数实例的临时本地盘,函数执行完实例回收后文件会直接丢失,根本存不到GCS里。
  • 另外你用globals()动态生成DataFrame变量的写法完全多余,徒增出bug的概率,直接往列表里追加读取到的DataFrame即可。
修复步骤
  • 替换requirements.txt为以下兼容Python 3.9的依赖版本,这些版本都提供预编译wheel,不需要本地编译C扩展,直接就能安装成功:
pandas==1.5.3
google-cloud-storage==2.7.0
numpy==1.24.2

不要在新运行时上pin跨度超过2年的老旧依赖,Cloud Functions的构建环境不会为老版本依赖保留兼容的编译工具链。

  • 重写函数逻辑,用GCS官方SDK遍历桶内文件、读写对象,不要用glob读GCS路径,也不要把结果写本地磁盘。修正后的可运行代码如下:
import pandas as pd
from google.cloud import storage
import io

def hello_gcs(event, context):
    """Triggered by a change to a Cloud Storage bucket.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """
    client = storage.Client()
    # 替换为你的实际桶名
    source_bucket = client.bucket("替换为你的存储桶名称")
    
    print(f"Processing trigger file: {event['name']}.")

    all_dfs = []
    # 遍历桶内所有二级子目录下的csv文件,匹配规则和你原逻辑一致
    for blob in source_bucket.list_blobs(match_glob="*/*.csv"):
        # 按原逻辑从文件名解析日期字段
        file_name = blob.name
        temp_segs = file_name.split("_")
        date_seg = temp_segs[2]
        read_date = date_seg.split("T")[0]
        
        # 直接读取GCS对象内容转DataFrame,不需要落本地盘
        content = blob.download_as_bytes()
        df = pd.read_csv(io.BytesIO(content), index_col=None, header=0)
        df["Read Date"] = read_date
        all_dfs.append(df)

    # 合并所有数据
    final_df = pd.concat(all_dfs, axis=0, ignore_index=True)
    
    # 结果直接写回GCS
    output_buf = io.BytesIO()
    final_df.to_csv(output_buf, index=False)
    output_buf.seek(0)
    # 替换为你要保存的结果对象路径
    output_blob = source_bucket.blob("NAME.csv")
    output_blob.upload_from_file(output_buf, content_type="text/csv")
  • 部署时确认函数运行时选择Python 3.9,同时给函数绑定的服务账号授予目标存储桶的存储对象查看、存储对象创建权限,否则会触发权限拒绝错误。

额外提醒:如果你桶内的csv总大小超过8G,不要用Cloud Functions做全量合并——Cloud Functions最大内存只有16G、最长执行时间9分钟,大文件量场景下会触发OOM或者超时,建议换Cloud Run或者Dataflow处理。

内容的提问来源于stack exchange,提问作者Martin Walczyński

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:06:25