h5py中ros3驱动如何指定自定义S3服务端点?
解决h5py ros3驱动连接自定义S3服务的端点指定问题
我们已编译启用支持HDF5原生ros3驱动的h5py,确认驱动已注册:
>>> import h5py >>> print(f'Registered drivers: {h5py.registered_drivers()}') Registered drivers: frozenset({ 'ros3', 'sec2', 'fileobj', 'core', 'family', 'split', 'stdio', 'mpio'})
但连接非AWS的自定义S3服务(如Ceph/S3)时,无法指定服务端点,按现有方式调用代码出现OSError: Unable to open file (curl cannot perform request)错误:
>>> h5py.File( f, driver='ros3', aws_region=bytes('unused', 'utf-8'), # 自定义S3无需该参数但调用时必填 secret_id=bytes(access_key, 'utf-8'), secret_key=bytes(secret_key, 'utf-8') )
尝试设置ENDPOINT、ENDPOINT_URL环境变量无效,以下是可行的解决方法:
方法1:使用HDF5专属环境变量指定端点
HDF5的ros3驱动支持通过HDF5_ROS3_ENDPOINT环境变量直接设置自定义S3服务的端点,设置后再运行代码即可:
# Linux/macOS终端 export HDF5_ROS3_ENDPOINT="http://your-custom-s3-endpoint:port" # Windows命令行 set HDF5_ROS3_ENDPOINT=http://your-custom-s3-endpoint:port
方法2:通过h5py的文件访问属性列表(FAPL)配置
可直接在代码中创建HDF5的文件访问属性列表,手动设置端点参数后传给h5py.File:
import h5py from h5py.h5p import create # 创建文件访问属性列表 fapl = create(h5py.h5p.FILE_ACCESS) # 设置ros3驱动基础参数 fapl.set_fapl_ros3( secret_id=bytes(access_key, 'utf-8'), secret_key=bytes(secret_key, 'utf-8'), aws_region=bytes('unused', 'utf-8') # 自定义S3仍需传入该参数 ) # 设置自定义端点 fapl.set_ros3_endpoint(bytes("http://your-custom-s3-endpoint:port", 'utf-8')) # 使用配置好的fapl打开文件 with h5py.File(f, 'r', driver='ros3', fapl=fapl) as fh5: # 后续文件操作 pass
注意:部分旧版本HDF5可能不支持set_ros3_endpoint方法,若出现该情况,优先使用环境变量方式,或升级HDF5至较新版本。
内容的提问来源于stack exchange,提问作者David Parks
相关产品推荐
相关产品推荐

