使用服务账号JSON密钥上传GCS时他人端认证失败,求排查
问题分析与解决方案
直接报错原因
你的报错是因为shutil.which("gcloud")返回了None——对方机器上没有安装Google Cloud CLI(gcloud),或者gcloud未添加到系统PATH中,导致找不到可执行文件,传给subprocess.run的第一个参数为None,触发类型错误。
冗余操作优化
另外,代码里调用gcloud auth activate-service-account完全是多余的:storage.Client.from_service_account_json()会直接使用指定的JSON密钥完成认证,不需要通过gcloud CLI做额外激活操作。这一步不仅没用,还强制依赖了gcloud CLI,增加了他人使用的门槛。
具体修复步骤
1. 移除冗余的gcloud CLI调用
修改config_gcloud函数,去掉subprocess调用部分,直接初始化storage客户端:
def config_gcloud(): storage_client = storage.Client.from_service_account_json(CREDENTIALS_LOCATION) return storage_client
2. 确保对方的密钥路径正确
- 要求对方将
CREDENTIALS_LOCATION设置为绝对路径,避免因脚本运行目录与密钥存放目录不一致导致的文件找不到问题。 - 确认密钥文件真实存在,文件名/路径无拼写错误,且文件权限允许读取(比如Windows下的权限限制)。
3. GCP UI端无需额外操作
你已经创建了权限充足的服务账号并提供了JSON密钥,GCP UI端不需要做额外认证操作——只要对方密钥文件正确、路径配置无误,就能直接通过代码完成认证。
备选:若必须保留gcloud CLI调用(不推荐)
如果因特殊需求必须使用gcloud CLI,需让对方:
- 安装Google Cloud CLI,并确保gcloud可执行文件在系统PATH中;或者直接在代码里指定gcloud的绝对路径(比如
"C:/Program Files/Google/Cloud SDK/google-cloud-sdk/bin/gcloud.cmd"或"/usr/bin/gcloud")。
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

