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
相关产品推荐
相关产品推荐

