使用ml4floods导出GEE数据至GCS时gcsfs抛出类型错误
使用ml4floods导出GEE数据至GCS时触发TypeError错误
问题背景
尝试用Python工具ml4floods将Google Earth Engine(GEE)数据导出到Google Cloud Storage(GCS)存储桶,工具后端依赖gcsfs实现该功能。
已配置的环境变量
已设置必要环境变量:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="/home/omer/sat/application_default_credentials.json" os.environ["GS_USER_PROJECT"] = "Floods-analysis" bucket_name = "floodanalysis"
错误回溯
运行代码时触发如下错误:
25 filename = f"{path_to_export}albania_ts_{date}" 26 desc=f"albania_ts_{date}" ---> 27 task = ee_download.mayberun( 28 filename, 29 desc, 30 lambda: img_export, 31 export_task_fun_img, 32 overwrite=False, 33 dry_run=False, 34 bucket_name=bucket_name, 35 verbose=2, 36 ) 37 if task is not None: 38 tasks.append(task) File ~/miniconda3/envs/ml4gdal/lib/python3.11/site-packages/ml4floods/data/ee_download.py:299, in mayberun(filename, desc, function, export_task, overwrite, dry_run, verbose, bucket_name) 296 if bucket_name is not None: 297 fs = get_filesystem("gs://") --> 299 files_in_bucket = fs.glob(f'gs://{bucket_name}/{filename}*') 300 if len(files_in_bucket) > 0: 301 if overwrite: ... 948 "should be str, int or float, got {!r} " 949 "of type {}".format(v, cls) 950 ) TypeError: Invalid variable type: value should be str, int or float, got None of type <class 'NoneType'>
已确认信息
已检查所有环境变量、项目信息,确认无误。凭证JSON文件内容如下:
{ "client_id": "<removed this>.apps.googleusercontent.com", "client_secret": "<removed this>", "quota_project_id": "floods-analysis", "refresh_token": "<removed-this>", "type": "authorized_user" }
解决思路
- 检查
filename变量有效性:错误发生在拼接GCS路径时,大概率是path_to_export或date变量为None,导致生成的filename包含空值。打印这两个变量的值,确认均为有效字符串。 - 手动验证gcsfs连接:直接初始化gcsfs并测试访问存储桶,排除凭证或项目配置问题:
import gcsfs fs = gcsfs.GCSFileSystem(project="Floods-analysis", token="/home/omer/sat/application_default_credentials.json") print(fs.ls("gs://floodanalysis")) - 排查版本兼容性:当前ml4floods可能与Python3.11、gcsfs版本不兼容。尝试降级到Python3.9/3.10,同时将gcsfs版本固定到
2023.6.0左右。 - 显式传递项目参数:若允许修改ml4floods源码,在
ee_download.py的get_filesystem调用中显式传入项目ID:
强制指定项目,避免依赖环境变量自动读取。fs = get_filesystem("gs://", project=os.environ.get("GS_USER_PROJECT"))
内容的提问来源于stack exchange,提问作者Muhammed Omer
相关产品推荐
相关产品推荐

