持有有效凭证却无法通过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
相关产品推荐
相关产品推荐

