Apache OpenDAL 0.47.10 常用工具与 API 详解
Apache OpenDAL 0.47.10 常用工具与 API 详解:OpenDAL 无命令行工具,按 API 速查 Operator 统一算子的 create_dir/write/read/stat/list 核心方法,给出代码示例与实测回显、AsyncOperator 与模块表面、storage schemes 支持矩阵与 FAQ。
Apache OpenDAL 0.47.10 常用工具与 API 详解
目标:详解 Apache OpenDAL 0.47.10 Python 绑定的常用 API。OpenDAL 以「库 + 统一算子」形态提供,没有独立命令行工具,数据访问通过
Operator(同步)/AsyncOperator(异步)完成。本文按 API 速查 create_dir、write、read、stat、list 等核心方法,给出代码示例与实测回显,并附 storage schemes 支持矩阵与 FAQ。已在 Ubuntu 22.04.5 LTS(Python 3.10.12)实测。
一、环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS |
| Python | python3 3.10.12 |
| OpenDAL Python 绑定 | 0.47.10(PyPI wheel,约 19.2 MB) |
| 实测 scheme | fs(本地文件系统),数据目录 /tmp/opendal-demo |
| 运行用户 | root |
二、工具概览
OpenDAL 以「库 + 统一算子」形态提供,没有 opendal 命令行可执行程序;对数据的全部操作都通过代码调用绑定 API 完成。Python 绑定模块表面(实测归纳):
| 模块/对象 | 作用 |
|---|---|
| Operator | 同步统一算子,本文实测主体 |
| AsyncOperator | 异步统一算子 |
| capability | 能力查询模块 |
| config / operator / services / types / layers / file / exceptions | 配置、算子、服务、类型、层、文件与异常等支撑模块 |
💡 说明:OpenDAL 的核心抽象是「一套 API 访问任意存储」:统一算子
Operator(同步)/AsyncOperator(异步)通过 scheme + 配置构建,换后端只改构建参数,API 调用方式不变。
三、前置条件
# 安装 opendal Python 绑定
pip3 install opendal
# 确认版本
python3 -c "import opendal; print(opendal.__version__)"
# 创建演示数据目录
mkdir -p /tmp/opendal-demo
实测输出:0.47.10。
四、核心 API 详解
4.1 Operator:构建统一算子
Operator 通过 scheme + 配置构建,是所有数据操作的入口:
import opendal
op = opendal.Operator('fs', root='/tmp/opendal-demo')
- 第 1 个位置参数为 scheme(存储后端),关键字参数为该后端配置(fs 只需 root)。
- 异步形态为
AsyncOperator,同样通过 scheme + 配置构建(本次实测以同步Operator为准)。
4.2 create_dir:创建目录
# fs 下真实创建目录;路径以 / 结尾表示目录
op.create_dir('subdir/')
实测确认:磁盘侧生成 /tmp/opendal-demo/subdir/ 目录(ls 核对存在)。
4.3 write / read:写入与读取
# 写入字节内容
op.write('hello.txt', b'Hello OpenDAL')
# 读回原始字节
data = op.read('hello.txt')
实测回显(打印 repr):
read('hello.txt') -> b'Hello OpenDAL'
write 接收字节串、read 返回字节对象;文本内容读取后用 data.decode('utf-8') 转换。
4.4 stat:查询元数据
st = op.stat('hello.txt')
print("stat('hello.txt') -> mode={}, size={}, last_modified={}".format(
st.mode, st.content_length, st.last_modified))
实测回显:
stat('hello.txt') -> mode=EntryMode.File, size=13, last_modified=2026-10-11 11:21:45.391546+00:00
| 元数据 | 含义(实测) |
|---|---|
| st.mode | 条目类型,文件为 EntryMode.File |
| st.content_length | 文件大小(字节),实测 13 与磁盘字节数一致 |
| st.last_modified | 最后修改时间(UTC 时区 +00:00) |
4.5 list:列出条目
# 列出根目录第一层条目
entries = op.list('')
print("list('') ->", [e.name for e in entries])
# 子目录写入并列出
op.write('subdir/nested.txt', b'nested content')
print("list('subdir/') ->", [e.name for e in op.list('subdir/')])
实测回显:
list('') -> ['/', 'hello.txt', 'subdir/']
list('subdir/') -> ['subdir/', 'nested.txt']
'/'为根标记;目录名带尾部斜杠(如subdir/),用于区分文件与目录。e.name取条目名;list只列出第一层条目。
五、storage schemes 支持矩阵
| Scheme | 后端 | 说明 |
|---|---|---|
| fs | 本地文件系统 | 本文实测使用 |
| s3 | AWS S3 / 兼容对象存储 | 常用 |
| oss | 阿里云对象存储 OSS | |
| gcs | Google Cloud Storage | |
| azblob | Azure Blob Storage | Azure 别名 azure |
| cos | 腾讯云 COS | |
| hdfs | Hadoop HDFS | |
| webdav / http / ftp / sftp | 网络文件协议 | |
| memory | 进程内内存 | 测试用 |
| sqlite / rocksdb / sled 等 | 各类嵌入式存储 |
⚠️ 注意:本文所有实测基于
fsscheme;其余 scheme 为官方支持矩阵口径,未在实测环境覆盖,接入前需准备对应服务的连接参数。
六、完整最小示例与实测回显
把上述 API 串成完整演示脚本 /tmp/opendal_demo.py:
import opendal
op = opendal.Operator('fs', root='/tmp/opendal-demo')
# 建目录(fs 下 create_dir 真实创建目录)
op.create_dir('subdir/')
print("create_dir('subdir/') OK")
# 写文件
op.write('hello.txt', b'Hello OpenDAL')
print("write('hello.txt', b'Hello OpenDAL') OK")
# 读文件
data = op.read('hello.txt')
print("read('hello.txt') ->", repr(data))
# stat
st = op.stat('hello.txt')
print("stat('hello.txt') -> mode={}, size={}, last_modified={}".format(
st.mode, st.content_length, st.last_modified))
# list 根目录
entries = op.list('')
print("list('') ->", [e.name for e in entries])
# 子目录写入并列出
op.write('subdir/nested.txt', b'nested content')
print("list('subdir/') ->", [e.name for e in op.list('subdir/')])
# 运行演示脚本
python3 /tmp/opendal_demo.py
实测回显(Python 3.10.12 + opendal 0.47.10):
create_dir('subdir/') OK
write('hello.txt', b'Hello OpenDAL') OK
read('hello.txt') -> b'Hello OpenDAL'
stat('hello.txt') -> mode=EntryMode.File, size=13, last_modified=2026-10-11 11:21:45.391546+00:00
list('') -> ['/', 'hello.txt', 'subdir/']
list('subdir/') -> ['subdir/', 'nested.txt']
磁盘侧核对(ls -laR /tmp/opendal-demo):hello.txt 13 字节、subdir/nested.txt 14 字节,与 API 读写的字节数完全一致。
七、注意事项
⚠️ 注意:
- OpenDAL 没有命令行工具,所有操作通过代码调用绑定 API 完成。
read返回字节对象、write接收字节串;文本需自行decode('utf-8')。list只列出第一层条目,根标记'/'与目录尾部斜杠属正常形态。- 三生态版本不同步(Rust 0.59.4 / Python 0.47.10 / Java 0.46.4),按所用生态选版本。
八、常见问题
Q1:OpenDAL 有 CLI 吗?
没有独立命令行工具,统一通过 Operator / AsyncOperator API 访问数据。
Q2:import opendal 报 ModuleNotFoundError?
未安装或 Python 版本低于 3.10。执行 pip3 install opendal 安装;若报 No matching distribution found,先把 Python 升级到 3.10 及以上。
Q3:stat 的 size 与磁盘大小对不上?
size 单位是字节;核对时用 ls -l 的字节数列(而非 ls -lh 的人类可读值)对比。本次实测 size=13 与磁盘 13 字节一致。
Q4:想换后端存储需要改很多代码吗? 只需更换构建 Operator 时的 scheme 与对应连接参数,write / read / stat / list 等 API 调用保持不变。
九、参考链接
- OpenDAL 官网:https://opendal.apache.org/
- Python 绑定 PyPI 页:https://pypi.org/project/opendal/
- OpenDAL 文档:https://opendal.apache.org/docs/