如何在Python脚本中直接使用内嵌JSON数据替代外部文件
核心错误点
你的代码存在三个问题,直接导致运行报错:
- 语法错误:用普通双引号包裹多行JSON内容时,内部的双引号没有做转义处理,Python解释器会直接抛出语法错误,代码无法正常执行
- 方法误用:
json.dumps()的作用是将Python原生字典/列表对象序列化为JSON格式字符串,你需要的是将JSON格式内容转换为Python可识别的字典结构,方法使用逻辑完全相反 - 接口不匹配:
ServiceAccountCredentials.from_json_keyfile_name()设计上仅接收本地JSON文件的路径作为入参,直接传入内存中的JSON字符串或字典对象,会触发文件不存在、参数格式不匹配类报错
正确实现方式
最简洁的实现是直接将凭证内容定义为Python原生字典,调用专门接收字典参数的接口,不需要经过JSON模块的序列化/反序列化流程,代码如下:
from oauth2client.service_account import ServiceAccountCredentials # 凭证内容直接以Python字典形式内嵌在脚本中,无需依赖外部文件 cred_config = { "type": "service_account", "project_id": "minipool", "private_key_id": "69fca468aede4ee9a884a7bfe9410badc4a6624a", "private_key": "-----BEGIN PRIVATE KEY-----\nSbAlvZ+OeIuaAKr3/wlFNg==\n-----END PRIVATE KEY-----\n", "client_email": "minipoolserver@minipool.iam.gserviceaccount.com", "client_id": "109697528046689636846", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/minipoolserver%40minipool.iam.gserviceaccount.com" } # 调用字典入参专用的方法生成凭证 creds = ServiceAccountCredentials.from_json_keyfile_dict(cred_config, scope)
如果你需要先以字符串形式存储JSON内容(比如内容是动态传入的场景),注意用三引号包裹多行字符串避免转义问题,再用json.loads()将字符串转为字典传入即可:
import json from oauth2client.service_account import ServiceAccountCredentials # 三引号包裹多行字符串,内部双引号不需要额外转义 json_content = ''' { "type": "service_account", "project_id": "minipool", "private_key_id": "69fca468aede4ee9a884a7bfe9410badc4a6624a", "private_key": "-----BEGIN PRIVATE KEY-----\nSbAlvZ+OeIuaAKr3/wlFNg==\n-----END PRIVATE KEY-----\n", "client_email": "minipoolserver@minipool.iam.gserviceaccount.com", "client_id": "109697528046689636846", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/minipoolserver%40minipool.iam.gserviceaccount.com" } ''' # 将JSON字符串解析为Python字典 cred_dict = json.loads(json_content) creds = ServiceAccountCredentials.from_json_keyfile_dict(cred_dict, scope)
提示:私钥类敏感信息直接硬编码在脚本中存在泄露风险,生产环境建议配合环境变量、专用密钥管理服务存储,不要明文写在代码文件中。
内容的提问来源于stack exchange,提问作者nak coder
相关产品推荐
相关产品推荐

