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

持有有效凭证却无法通过OPeNDAP访问ESGF数据的问题求助

问题:xarray通过ESGF OPeNDAP访问CORDEX数据时的权限失败问题

背景

我尝试用Python的xarray工具,通过ESGF的OPeNDAP服务访问CORDEX气候数据,目标数据集的OPeNDAP地址为:
https://esg-dn1.nsc.liu.se/thredds/dodsC/esg_dataroot7/cordexdata/cordex/output/CAS-44/BOUN/MOHC-HadGEM2-ES/rcp45/r1i1p1/BOUN-RegCM4-3/v5/day/tas/v2019116/tas_CAS-44_MOHC-HadGEM2-ES_rcp45_r1i1p1_BOUN-RegCM4-3_v5_day_20060201-20101230.nc

当前配置与测试情况

  • 已将ESGF凭证保存为credentials.pem,并在用户主目录配置了.dodsrc文件,内容如下:
    HTTP.VERBOSE=0
    HTTP.COOKIEJAR=C:\Users\tsh371/.esg.dods_cookies
    HTTP.SSL.VALIDATE=0
    HTTP.SSL.CERTIFICATE=C:\Users\tsh371/.esg\credentials.pem
    HTTP.SSL.KEY=C:\Users\tsh371/.esg\credentials.pem
    HTTP.SSL.CAPATH=C:\Users\tsh371/.esg\ca-trustroots
    
  • 使用xarray.open_dataset()访问时报错:[Errno -77] NetCDF: Access failure
  • 调用requests.get(url, cert='C:/Users/tsh371/.esg/credentials.pem')可成功获取数据切片,但不指定凭证返回401
  • 在其他气候数据平台配置.dodsrc后,无需显式指定凭证即可正常访问

复现代码

import pyesgf
import xarray as xa
import os

os.environ['HOME'] = os.environ['USERPROFILE'] # Windows下让pyesgf识别HOME目录
from pyesgf.logon import LogonManager

lm = LogonManager()
lm.logon(username = None, password = None, hostname = 'esgf-node.ipsl.upmc.fr', bootstrap=True)

opendapurl = 'https://esg-dn1.nsc.liu.se/thredds/dodsC/esg_dataroot7/cordexdata/cordex/output/CAS-44/BOUN/MOHC-HadGEM2-ES/rcp45/r1i1p1/BOUN-RegCM4-3/v5/day/tas/v2019116/tas_CAS-44_MOHC-HadGEM2-ES_rcp45_r1i1p1_BOUN-RegCM4-3_v5_day_20060201-20101230.nc'

xa.open_dataset(opendapurl)

疑问

我的.dodsrc配置是否存在错误?或者如何让xarray正确识别证书位置?


解决方案

1. 统一.dodsrc中的路径分隔符

Windows系统下,路径建议统一使用正斜杠/(避免转义问题),修改后的.dodsrc内容:

HTTP.VERBOSE=0
HTTP.COOKIEJAR=C:/Users/tsh371/.esg.dods_cookies
HTTP.SSL.VALIDATE=0
HTTP.SSL.CERTIFICATE=C:/Users/tsh371/.esg/credentials.pem
HTTP.SSL.KEY=C:/Users/tsh371/.esg/credentials.pem
HTTP.SSL.CAPATH=C:/Users/tsh371/.esg/ca-trustroots

2. 显式指定.dodsrc的环境变量

netCDF库依赖DODSRC环境变量定位配置文件,若文件不在默认搜索路径,需在代码开头添加:

os.environ['DODSRC'] = 'C:/Users/tsh371/.dodsrc'

3. 确保pyesgf登录有效

代码中lm.logon()未传入用户名密码,可能导致登录失败。尝试显式传入ESGF账号信息:

lm.logon(username='你的ESGF用户名', password='你的ESGF密码', hostname='esgf-node.ipsl.upmc.fr', bootstrap=True)

同时确认credentials.pem为有效凭证(可通过ESGF官网重新生成)。

4. 强制设置netCDF证书环境变量

若上述方法无效,可在调用xarray.open_dataset()前直接设置证书路径:

os.environ['NC_SSL_CERT_FILE'] = 'C:/Users/tsh371/.esg/credentials.pem'
os.environ['NC_SSL_KEY_FILE'] = 'C:/Users/tsh371/.esg/credentials.pem'

5. 验证CA证书路径

确保ca-trustroots目录下存在有效CA证书,若缺失可通过以下命令重新获取:

lm.bootstrap()

内容的提问来源于stack exchange,提问作者TiemvdDeure

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:21:31