You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:42:26