Python sys.argv触发IndexError列表索引越界报错解决
GCS文件上传报IndexError: list index out of range 排查方案
错误根因
这个报错和Google Cloud Storage SDK本身无关,是代码逻辑存在三个明显问题:
- 命令行参数读取逻辑不匹配运行方式:入口代码强制读取
sys.argv[1]/sys.argv[2]/sys.argv[3]三个位置参数,但运行脚本时没有传入对应参数。sys.argv列表默认第一个元素(索引0)是脚本自身文件名,直接运行python 你的脚本名.py不带额外参数时,列表长度只有1,访问索引1、2、3必然触发列表越界错误。 - 函数传参完全无效:你虽然给
upload_blob定义了三个入参,也在入口处尝试传参,但函数内部第一时间就把bucket_name、source_file_name、destination_blob_name三个变量重新赋值为硬编码的固定值,外部传的参数根本不会被用到。 - GCS客户端参数用法错误:你给
kms_key_name传的是本地服务账号JSON文件的路径,这个参数实际需要传入GCP KMS客户管理密钥的完整资源ID,本地服务账号密钥需要通过设置GOOGLE_APPLICATION_CREDENTIALS环境变量加载,不能填在这里。如果没有自定义KMS加密需求,直接去掉这个参数即可,默认会使用Google托管的服务端加密。
修正方案
根据你的使用场景二选一即可:
方案1:使用固定配置,不需要命令行传参
如果你就用代码里写死的桶名、本地文件路径、存储对象名,直接删掉入口处读取命令行参数的逻辑,直接调用函数即可,修正后代码如下:
from google.cloud import storage import os # 提前配置服务账号密钥路径,也可以提前在系统环境变量里设置 os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "C:/Users/test/df08d120148c00.json" def upload_blob(): """Uploads a file to the bucket.""" bucket_name = "test1" source_file_name = "C:/Users/test/p3.csv" destination_blob_name = "Test_Upload" storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) # 无自定义KMS需求就去掉kms_key_name参数 blob = bucket.blob(destination_blob_name) blob.upload_from_filename(source_file_name) print(f"File {source_file_name} uploaded to {destination_blob_name}.") if __name__ == "__main__": upload_blob()
直接运行脚本即可,不需要带任何额外参数。
方案2:保留命令行传参能力,灵活传入配置
如果你需要运行时动态指定上传参数,就删掉函数内部硬编码的赋值逻辑,运行脚本时按顺序传入三个参数,修正后代码如下:
from google.cloud import storage import os import sys os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "C:/Users/test/df08d120148c00.json" def upload_blob(bucket_name, source_file_name, destination_blob_name): """Uploads a file to the bucket.""" storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(destination_blob_name) blob.upload_from_filename(source_file_name) print(f"File {source_file_name} uploaded to {destination_blob_name}.") if __name__ == "__main__": # 加参数长度校验,避免再出现越界错误 if len(sys.argv) != 4: print("用法: python upload.py <桶名> <本地文件路径> <GCS存储对象名>") sys.exit(1) upload_blob( bucket_name=sys.argv[1], source_file_name=sys.argv[2], destination_blob_name=sys.argv[3], )
运行时按格式传参即可,示例:python upload.py test1 C:/Users/test/p3.csv Test_Upload
注意:如果你的桶名不是全局唯一的、或者服务账号没有对应桶的上传权限,修正参数问题后还可能抛出权限/桶不存在的错误,需要提前确认GCP侧资源配置正确。
内容的提问来源于stack exchange,提问作者Lakshmi_N
相关产品推荐
相关产品推荐

