无法在Google Cloud Function部署含Polygon库的Python脚本求解决
问题解决与部署方案
一、先解决构建错误(ERROR: failed to build...)
你遇到的构建错误和Polygon支持无关,大概率是依赖未正确声明导致的。Cloud Function部署时会根据requirements.txt安装依赖,你需要明确添加Polygon的Python SDK依赖:
创建requirements.txt文件,内容如下:
polygon-api-client>=1.14.0 python-dateutil>=2.8.2
二、适配Cloud Function的代码调整
你的代码需要修改为符合Cloud Function触发规范的结构,同时优化全局变量的使用(避免冷启动或并发问题)。以下是适配Pub/Sub触发的版本(匹配你的定时触发需求):
from polygon import RESTClient import json from typing import cast from urllib3 import HTTPResponse import datetime import os def get_stocks_data(event, context): # 从环境变量读取API密钥,避免硬编码敏感信息 api_key = os.getenv("POLYGON_API_KEY") client = RESTClient(api_key=api_key, trace=False) maang_companies = ["META", "AAPL", "AMZN", "GOOGL", "NFLX"] stock_data = {} today = datetime.date.today() one_day_prior = today - datetime.timedelta(days=1) one_day_prior_str = one_day_prior.strftime("%Y-%m-%d") for stock in maang_companies: aggs = cast( HTTPResponse, client.get_aggs( stock, 1, "day", one_day_prior_str, one_day_prior_str, raw=True ), ) data = json.loads(aggs.data) stock_data[stock] = data # 可根据需求扩展:写入Cloud Storage/BigQuery、发送通知等 print(json.dumps(stock_data, indent=2)) return "Data fetched successfully"
代码调整说明:
- 入口函数改为
get_stocks_data(event, context),符合Pub/Sub触发的函数签名要求 - 用环境变量存储Polygon密钥,避免代码泄露敏感信息
- 将
client和stock_data移到函数内部,避免全局变量在冷启动时的状态冲突
三、部署与触发配置
部署Cloud Function:
使用gcloud命令行(或GCP控制台)部署:gcloud functions deploy get_stocks_data \ --runtime python311 \ --trigger-topic YOUR_PUBSUB_TOPIC_NAME \ --set-env-vars POLYGON_API_KEY=你的Polygon密钥替换
YOUR_PUBSUB_TOPIC_NAME为你创建的Pub/Sub主题名称。配置Cloud Scheduler定时触发:
- 在GCP控制台创建Cloud Scheduler任务,选择Pub/Sub作为目标,指定上述创建的主题
- 设置调度时间为午夜(Cron表达式示例:
0 0 * * *,对应UTC时间午夜,可根据你的时区调整)
四、额外注意事项
- 确保Cloud Function的服务账号拥有Pub/Sub订阅权限,默认网络配置即可访问Polygon公网API
- 如果需要持久化数据,可在函数中添加代码将
stock_data写入Cloud Storage或BigQuery - 测试时可手动发布Pub/Sub消息触发函数,通过Cloud Function日志排查问题
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

