Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

OpenList API

OpenList API 的 Python 客户端。

特性

  • 基于 httpx 的异步设计,同时提供同步接口
  • 类似 pathlib.Path 的面向对象文件操作接口
  • 完整的文件系统操作方法
  • 用户管理和认证
  • 支持流式及分片上传
  • 使用 Pydantic 定义明确的类型
  • 层次化的异常体系

要求

  • Python 3.10 或以上版本
  • 无操作系统及架构限制

安装

使用 pip 安装:

pip install openlist

快速开始

基础用法

import asyncio
from openlist import Client

async def main():
    async with Client("https://your-server.com") as client:
        await client.login("username", "password")
        
        # 获取当前用户信息
        user_info = await client.user.me()
        print(f"当前用户: {user_info.username}")

asyncio.run(main())

文件系统操作 (函数式)

async def main():
    async with Client("https://your-server.com") as client:
        await client.login("username", "password")
        fs = client.fs
        
        # 列出目录
        files = await fs.listdir("/data")
        for f in files:
            print(f"{f.name} - {'目录' if f.is_dir else '文件'}")
        
        # 获取文件信息
        info = await fs.stat("/data/file.txt")
        print(f"大小: {info.size}, 修改时间: {info.modified}")
        
        # 检查路径
        if await fs.exists("/data/file.txt"):
            print("文件存在")
        
        # 创建目录
        await fs.mkdir("/data/new_folder", exist_ok=True)
        
        # 上传文件
        await fs.write_bytes("/data/hello.txt", b"Hello, World!")
        
        # 从本地上传 (分片流式)
        await fs.upload_file("local_file.zip", "/data/remote_file.zip")
        
        # 复制、移动、删除
        await fs.copy("/data/file.txt", "/backup/")
        await fs.move("/data/old.txt", "/archive/")
        await fs.remove("/data/temp.txt")

文件系统操作 (pathlib 风格)

async def main():
    async with Client("https://your-server.com") as client:
        await client.login("username", "password")
        
        # 创建路径对象
        root = client.path("/data")
        
        # 路径操作 (不涉及网络)
        config = root / "config" / "settings.json"
        print(f"路径: {config}")           # /data/config/settings.json
        print(f"名称: {config.name}")      # settings.json
        print(f"父目录: {config.parent}")  # /data/config
        print(f"扩展名: {config.suffix}")  # .json
        
        # 文件操作 (网络请求)
        if await config.exists():
            info = await config.stat()
            print(f"大小: {info.size} bytes")
        
        # 遍历目录
        async for item in root.iterdir():
            is_dir = await item.is_dir()
            print(f"  {item.name} {'[DIR]' if is_dir else ''}")
        
        # 创建目录
        new_dir = root / "new_folder"
        await new_dir.mkdir(exist_ok=True)
        
        # 写入文件
        file = new_dir / "hello.txt"
        await file.write_bytes(b"Hello!")
        
        # 重命名
        renamed = await file.rename("greeting.txt")
        
        # 移动文件
        await renamed.move_to(root / "archive")
        
        # 删除
        await (root / "archive" / "greeting.txt").unlink()

上传选项

from openlist.models.file import UploadOptions

async def main():
    async with Client("https://your-server.com") as client:
        await client.login("username", "password")
        
        options = UploadOptions(
            overwrite=True,      # 覆盖已存在的文件
            as_task=False,       # 作为后台任务
        )
        
        await client.fs.write_bytes(
            "/data/file.txt",
            b"content",
            options=options
        )

OTP 双因素认证

async def main():
    async with Client("https://your-server.com") as client:
        await client.login("username", "password", otp_key="your-otp-secret")

异常处理

from openlist.exceptions import (
    FileNotFoundError,
    FileExistsError,
    PermissionDeniedError,
    AuthenticationError,
)

async def main():
    async with Client("https://your-server.com") as client:
        await client.login("username", "password")
        
        try:
            await client.fs.stat("/not_exist")
        except FileNotFoundError as e:
            print(f"文件不存在: {e.path}")
        
        try:
            await client.fs.mkdir("/existing_dir")
        except FileExistsError as e:
            print(f"目录已存在: {e.path}")

模块结构

模块 说明
openlist.Client 异步客户端入口
openlist.core.file.AsyncFileSystem 异步文件系统服务
openlist.core.file.SyncFileSystem 同步文件系统服务
openlist.core.file.RemotePath pathlib 风格路径对象
openlist.models.file 文件系统 Pydantic 模型
openlist.exceptions 异常类型定义

Metadata

Release files for openlist 0.1.1b3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for openlist 0.1.1b3
File Size Uploaded
openlist-0.1.1b3.tar.gz 35.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for openlist 0.1.1b3
File Interpreter ABI Platform
openlist-0.1.1b3-py3-none-any.whl Python 3 none any Details

Total release size: 76.7 kB

Release files / openlist-0.1.1b3.tar.gz

Download URL openlist-0.1.1b3.tar.gz
Size 35.1 kB
Tags Source
SHA-256 checksum
How to use checksums
4a60625f753939b6560729cce3fe74fc6872525c351852cd3786674b54c15469
BLAKE2b-256 checksum
How to use checksums
956a4e57855e9b7c03127a56ed8d763b8dd238b190ba4d8a7fda4dc9a9c8ee29
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.10

Release files / openlist-0.1.1b3-py3-none-any.whl

Download URL openlist-0.1.1b3-py3-none-any.whl
Size 41.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0723ff212fe973fd99cac716c3386108a9989d631183308ba46ab25b6f26f6d6
BLAKE2b-256 checksum
How to use checksums
1becedc3843a4969c5f484ba0bdb6e012d932d52ae4662a9c58432b951e5a257
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.10
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page