Docs | Services | Blog | Community | Download | License | Security | Vision | Concepts | Specifications | Rust | Foundation | Events | Sponsorship | Thanks | Code of Conduct | C++ | Dart | .NET | Go | Haskell | Java | Lua | Node.js | OCaml | PHP | Python | Getting started
Getting StartedYour first program
This program builds an operator, writes a file, reads it back, inspects its metadata, and deletes it. It runs against the in-memory service with no credentials, so you can run it right after installing.
Install from PyPI:
pip install opendal
Or install from conda-forge:
conda install conda-forge::opendal
import opendal
# Configure a service, then build an operator from it.
op = opendal.Operator("memory")
# The same verbs work on every service.
op.write("hello.txt",b"Hello, World!")
data = op.read("hello.txt")# returns bytes
print(data.decode())
meta = op.stat("hello.txt")
print(f"size = {meta.content_length} bytes")
op.delete("hello.txt")
Note that write takes bytes and read returns bytes.
Point it at a real backend
Only the service changes; the operations stay identical. The scheme is the first argument, and configuration is passed as keyword arguments:
import opendal
op = opendal.Operator("s3", bucket="my-bucket", region="us-east-1")
op.write("hello.txt",b"Hello from S3!")
print(op.read("hello.txt"))
The wheel bundles every service, so there is nothing extra to install. The next page,
, covers configuration and credentials in depth;
lists every backend and its keys.
Async usage
OpenDAL has a first-class async API. Use
with the same verbs, awaiting each call:
import asyncio
import opendal
asyncdefmain():
op = opendal.AsyncOperator("s3", bucket="my-bucket", region="us-east-1")
await op.write("hello.txt",b"Hello, World!")
data =await op.read("hello.txt")
print(data.decode())
asyncio.run(main())
Both operators expose the same operations. Convert between them with op.to_async_operator() and op.to_operator() when you need the other form.