项目快照:marimo-team/marimo,约 22,810 个 Star,1,271 个 Fork;最新推送时间 2026-09-17T02:59:12Z。本文基于仓库公开资料撰写。

项目地址:https://github.com/marimo-team/marimo · https://marimo.io

marimo 从代码、运行环境到实践流程的项目封面
marimo 的项目能力与实践流程示意。

marimo:以纯 Python 文件保存的响应式笔记本与应用开发环境

marimo 是一个使用 Python 实现的响应式笔记本(Reactive Notebook)项目。它将单元格依赖执行、交互式界面、SQL 查询、脚本运行和 Web 应用部署放在同一套工作流中,并把笔记本保存为可直接进入 Git 版本控制的 .py 文件。

根据题目提供的 GitHub 元信息,项目默认分支为 main,主要语言为 Python,采用 Apache License 2.0;资料快照中的 Star 数为 22,810,Fork 数为 1,271。软件包元数据显示当前版本为 0.24.2,要求 Python >=3.10

“marimo is a reactive Python notebook: run a cell or interact with a UI element, and marimo automatically runs dependent cells (or marks them as stale), keeping code and outputs consistent.”

来源:README

项目速览(TL;DR)

marimo 的核心差异不只是提供浏览器内的代码单元格,而是维护单元格之间的依赖关系,并在输入变化时重新执行相关单元格或将其标记为过期。对于需要版本控制、脚本执行和交互展示共用一份 Python 源文件的项目,它提供了一条连贯路径。

项目维度 资料中的信息 直接影响
保存格式 纯 Python 文件 可以使用 Git 查看文本差异,也可从其他笔记本导入函数和类
执行模型 响应式依赖执行 运行单元格或操作界面元素时,相关下游单元格会执行或被标记为过期
数据能力 一等 SQL 支持、数据框浏览与筛选 可在笔记本工作流中查询数据框、数据库、数据仓库或湖仓
交付形式 脚本、交互式 Web 应用、幻灯片和浏览器 WASM 同一项目可面向开发、自动执行和交互展示
测试方式 支持对笔记本运行 pytest 笔记本逻辑可以进入自动化测试流程
许可证 Apache-2.0 允许商用和再分发,但必须履行许可证规定的通知与分发义务

README 将 marimo 描述为可覆盖 jupyterstreamlitjupytextipywidgetspapermill 等工具部分职责的完整环境。这是项目自身的定位陈述,不代表所有 API、扩展生态和存量文件都能无差异替换。

定位与目标用户

marimo 面向希望减少笔记本隐藏状态、同时保留交互式探索体验的 Python 使用者。它还面向需要把探索代码继续转成脚本、测试对象或 Web 应用,而不希望长期维护多份实现的团队。

它试图解决的问题

传统的自由顺序单元格执行容易让内存状态与屏幕上的代码不一致。marimo 根据代码依赖关系组织执行,使输入变化能够传递到依赖该输入的下游计算,从执行模型上约束状态漂移。

第二个问题是笔记本文件的审查与复用。项目将内容存成 .py 文件,因此代码可以进入文本差异审查、格式化、测试和模块导入流程;README 还明确说明,笔记本可以作为 Python 脚本执行,并可通过命令行参数进行参数化。

与 README 所列替代方案的取舍

根据本文作者的经验判断,当团队要求“探索、应用展示、脚本执行和 Git 审查共用一份源文件”时,可以优先评估 marimo。若现有系统依赖特定 Jupyter 扩展、既有 .ipynb 工具链、Streamlit API,或以 papermill 为中心的既定流水线,则应先做兼容性验证,而不是依据 README 中的“replaces”表述直接替换。

资料只说明推荐依赖中包含 nbformat>=5.7.0,用于导出 IPYNB;没有给出对全部 Jupyter 扩展、控件和元数据的兼容范围。迁移前应使用代表性笔记本验证导入、导出、交互控件和执行顺序。

核心功能与工作机制

marimo 的功能围绕依赖图、纯 Python 存储和统一交付展开。理解触发条件与数据流,比只看功能清单更有助于判断它是否适合现有工程。

响应式执行与过期状态

触发条件包括运行某个单元格,以及与绑定的用户界面(User Interface,UI)元素交互。marimo 会识别依赖该结果的单元格,并自动执行这些下游单元格;对于代价较高的笔记本,README 还说明系统可将相关单元格标记为过期,而不是立即重算。

输入是单元格中的 Python 定义或 UI 值,输出是更新后的依赖单元格结果或过期标记。README 将这种模型与“无隐藏状态”和确定性执行联系起来,但资料未给出依赖分析算法、循环依赖处理规则及并行调度策略,相关细节应以最新文档为准。

无回调的交互组件绑定

README 表明滑块、表格和图表等组件可以绑定到 Python,而无需编写回调函数。用户操作组件后,值变化进入响应式依赖链,下游 Python 计算和展示结果据此刷新。

这种方式把交互输入视为计算图中的数据,而不是散落在事件处理器中的副作用。官方仓库资料未提供组件的完整类型列表、事件时序、状态持久化规则和浏览器兼容矩阵,建议以最新 README 和交互指南为准。

SQL 与数据工作流

项目支持在笔记本中查询数据框、数据库、数据仓库和湖仓,并提供数据框筛选与搜索。根据 pyproject.toml,SQL 可选依赖由 duckdb>=1.0.0polars[pyarrow]>=1.9.0sqlglot[c]>=26.8.0 组成。

这些依赖分别对应 SQL 单元格执行、将 SQL 输出带回 Python,以及 SQL 单元格解析。资料没有列出受支持数据库驱动、认证方式、SQL 方言覆盖范围、事务语义和查询下推边界,因此不能据此推断所有外部数据系统都可直接连接。

脚本、应用和浏览器运行

README 明确列出三类交付路径:作为 Python 脚本执行、部署为交互式 Web 应用或幻灯片,以及通过 WebAssembly(WASM)在浏览器中运行。脚本模式还支持由命令行参数进行参数化,但所给资料没有提供参数声明与绑定语法。

输入仍是同一个纯 Python 笔记本文件,输出形式取决于所选运行方式。应用部署所需的生产命令、反向代理、身份认证、进程数、持久化和扩缩容参数未出现在资料中,不能将本地编辑命令直接视为生产部署方案。

复用、测试与编辑器能力

marimo 允许从一个笔记本向另一个笔记本导入函数和类,并支持使用 pytest 测试笔记本。由于保存格式是 Python,这些能力可以与代码审查和现有 Python 工具链衔接,但测试发现规则及示例命令未在给定资料中展开。

编辑器侧提供变量浏览、Vim 键位、GitHub Copilot 和内置 AI 功能,并可在 VS Code、Cursor、PyCharm、Neovim、Zed 或其他文本编辑器中编辑。AI 功能的模型提供方配置、数据保留政策和密钥字段未在所给文件中说明。

系统架构与关键模块

仓库资料没有给出正式架构图,但依赖声明足以确认其由 Python 命令行入口、Web 服务、编辑能力、数据适配和前端工程组成。下表仅描述配置文件中有直接证据的职责,不推断未披露的内部类或接口。

逻辑层 相关组件 资料可确认的职责
命令行入口 click>=8.0,<9 marimo 命令映射到 marimo._cli.cli:main
Web 服务 uvicornstarlettewebsockets 提供 Web 服务器、Web 框架、实时通信及语言服务器相关 WebSocket 支持
内容处理 markdownpymdown-extensionspygmentsdocutils 处理 Markdown、扩展语法、代码高亮和 RST 解析
编辑辅助 jedi 提供代码补全能力
配置与元数据 tomlkitpyyamlpackaging 读写配置、处理 Markdown 前置元数据和版本信息
数据抽象 narwhals>=2.0.0 支撑数据框相关能力
协作与进程通信 loropyzmq 分别用于协作编辑,以及沙箱内核和多笔记本运行所需的进程间通信
资源信息 psutil>=5.0 展示内存、CPU 和其他系统资源信息
前端工程 pnpmturbovitestoxfmt 承担前端开发、构建、测试、类型检查和格式化任务

构建后端是 uv_build,允许版本范围为 >=0.8.3,<0.13.0。仓库没有在所给资料中公开完整目录结构、前后端协议、依赖图存储形式和内核生命周期状态机,相关架构结论不应超出上述证据。

依赖与运行环境

使用已发布的 Python 包只需要满足 Python 版本要求;从仓库参与前端开发还需要满足单独的 Node.js 与 pnpm 约束。两类环境不要混为一谈。

Python 运行要求

  • requires-python>=3.10
  • 分类器明确列出 Python 3.10、3.11、3.12、3.13 和 3.14。
  • 项目声明操作系统无关,并面向控制台和 Web 环境。
  • uvicornstarlettewebsockets 等依赖通过平台条件排除 Emscripten。
  • loropsutil 在 Emscripten 和 Android 条件下被排除。

前端源码开发要求

  • 根据 package.json,Node.js 要求为 >=22.12.0
  • pnpm 要求为 >=10.34.5,仓库指定的包管理器是 pnpm@10.34.5
  • 前端开发脚本为 pnpm run --filter @marimo-team/frontend dev
  • 仓库级任务通过 Turbo 执行,包括 typechecktestbuildcodegen

官方仓库未在给定资料中提供操作系统最低版本、浏览器最低版本、CPU 架构矩阵和最低内存要求,建议以最新 README、发行说明和软件包元数据为准。

快速开始:安装、运行与验证

README 给出的最短入口是通过 pip 安装,然后打开内置入门教程。下面的命令只用于本地或隔离测试环境,不包含远程部署和公网暴露。

步骤一:安装并启动教程

Bash
python -m pip install marimo
marimo tutorial intro

第一条命令安装名为 marimo 的 Python 包;第二条命令来自 README,用于运行 intro 教程。资料没有说明该命令使用的端口、监听地址或浏览器启动规则,因此不应预设固定端口。

步骤二:创建最小本地验证脚本

Python
import marimo

print(marimo.__name__)

将以上内容保存为 verify_marimo.py,再执行下列命令。该验证只检查当前 Python 环境能否导入已安装的软件包,不代表 SQL、AI、沙箱或 Web 应用功能已经安装完毕。

Bash
python verify_marimo.py

预期输出为 marimo。至此形成“安装软件包、运行官方教程、导入并验证包名”的最小闭环;由于所给资料没有提供 marimo 笔记本文件的生成代码模板,本文不手写未核实的装饰器或单元格 API。

启用 SQL 可选依赖

Bash
python -m pip install "marimo[sql]"

该额外依赖组定义在 pyproject.toml 中,会引入 DuckDB、Polars、PyArrow 相关能力和 SQLGlot。数据库连接字符串、凭据管理和外部驱动安装方式未在资料中提供。

配置说明

所给资料没有包含面向最终用户的运行时配置样例、环境变量文件或配置目录说明。下表列出仓库中可以核验的打包与开发配置;它们不能等同于完整的应用运行参数。

字段名 类型 默认值或固定值 作用
project.name 字符串 marimo Python 发布包名称
project.version 字符串 0.24.2 资料快照中的软件包版本
project.requires-python 版本约束字符串 >=3.10 限定可安装的 Python 版本
project.license 字符串 Apache-2.0 声明项目许可证标识
project.scripts.marimo 入口点字符串 marimo._cli.cli:main 注册 marimo 命令行入口
build-system.build-backend 字符串 uv_build 指定 Python 包构建后端
engines.node 版本约束字符串 >=22.12.0 约束仓库前端开发所需的 Node.js 版本
engines.pnpm 版本约束字符串 >=10.34.5 约束前端包管理器版本
packageManager 字符串 pnpm@10.34.5 固定仓库使用的包管理器及版本

监听地址、服务端口、日志级别、身份认证、会话过期时间、代理头、TLS、数据库连接和 AI 提供方环境变量均未出现在给定资料中。对于这些字段,官方仓库未提供该信息,建议以最新 README 和文档为准,不应自行套用其他 ASGI 应用的环境变量名称。

可选依赖与功能组合

marimo 通过 Python 可选依赖组拆分 SQL、沙箱、语言服务器、模型上下文协议和可观测性能力。部署前应按实际使用范围安装,避免把开发或集成功能误认为核心依赖。

  • sql:包含 DuckDB、Polars 与 SQLGlot,用于 SQL 单元格、结果回传和 SQL 解析。
  • sandbox:包含 uv>=0.9.21,用于沙箱管理和本地 HTML-WASM 导出。
  • recommended:组合 SQL 与沙箱能力,并增加 cryptography、Altair、Pydantic AI、Ruff 和 nbformat。
  • lsp:包含 python-lsp-server>=1.13.0python-lsp-ruff>=2.0.0
  • mcp:包含 httpx2>=2.5.0,<3mcp>=2.0.0,<3
  • otel:包含 OpenTelemetry API、SDK,以及 OTLP HTTP 和 gRPC 导出器。

recommended 中的 cryptography>=42.0.0用于 Ed25519 持久缓存清单签名,altair>=5.4.0用于数据源查看器绘图,ruff用于格式化,nbformat>=5.7.0用于导出 IPYNB。Pydantic AI 的约束为 pydantic-ai-slim[openai]>=1.107.0,<3.0.0,资料没有给出具体模型、端点和密钥配置。

进阶用法

进阶使用重点在于把笔记本纳入工程流程,而不是只增加更多交互组件。可优先评估沙箱隔离、脚本参数化、代码复用、测试、应用交付和编辑器集成。

沙箱内核与隔离编辑

pyproject.toml 的注释明确出现了 marimo edit --sandbox DIRECTORY,说明项目支持面向目录的沙箱编辑模式。对应的 sandbox 额外依赖包含 uv,而 pyzmq 用于每笔记本沙箱内核的进程间通信。

Bash
python -m pip install "marimo[sandbox]"
marimo edit --sandbox DIRECTORY

DIRECTORY 应替换为本地测试目录。资料没有说明沙箱的文件系统权限、网络隔离级别、系统调用边界和资源配额,因此不能把该功能等同于完整的安全容器。

从笔记本到工程资产

  1. 将稳定的函数和类保留在可导入的 Python 笔记本中,供其他笔记本复用。
  2. 使用 README 所述的 pytest 支持,为关键转换、计算和参数边界建立测试。
  3. 需要无人值守执行时,使用脚本模式和命令行参数化能力,而不是依赖人工操作 UI。
  4. 需要展示交互结果时,再使用应用或幻灯片交付路径。
  5. 需要 IPYNB 交换格式时,安装包含 nbformat 的推荐依赖并验证导出结果。

上述流程中的具体测试命令、部署命令、脚本参数声明和 IPYNB 导出命令未包含在给定资料中。官方仓库未提供该信息,建议以最新 README 和对应指南为准。

AI 与编辑器集成边界

README 将 marimo 定位为面向 AI 的现代编辑器,支持与 Claude Code 等代理配合,也提供内置 AI 功能和 GitHub Copilot 集成。资料只能确认功能入口存在,不能确认每一种模型、地区和账户类型均可使用。

在依赖层面,推荐依赖包含带 OpenAI 扩展的 pydantic-ai-slim,而 MCP 可选依赖包含 mcphttpx2。AI 请求的数据范围、提示词记录方式、遥测、供应商保留政策、密钥变量名和企业数据处理协议均未在所给资料中披露。

根据本文作者的经验判断,处理源代码、客户数据或内部数据库前,应先确认实际启用的 AI 提供方、请求目标、日志策略和组织授权。未完成审查时,可以只使用本地编辑与计算能力,不配置外部模型凭据。

可观测性与运维

项目具备系统资源展示和 OpenTelemetry 可选集成的依赖基础,但所给资料不足以形成完整生产运维手册。可确认的范围是 CPU、内存等系统信息,以及 OTLP HTTP 和 gRPC 导出组件。

核心依赖中的 psutil>=5.0用于展示 RAM、CPU 使用情况和其他系统工具信息。otel 额外依赖使用 opentelemetry-api~=1.28.0opentelemetry-sdk~=1.28.0,并提供 OTLP HTTP 与 gRPC 导出器。

Bash
python -m pip install "marimo[otel]"

资料没有给出指标名称、追踪跨度、日志格式、健康检查路径、告警规则、采样策略、OTLP 地址字段或环境变量。官方仓库未提供该信息,建议以最新 README 和运维文档为准;不要未经核实就把其他 OpenTelemetry 应用的配置直接复制到生产环境。

同样缺失的信息包括进程模型、并发上限、会话恢复、滚动升级、备份、灾难恢复、服务级别协议(SLA)和性能基准。项目资料没有给出吞吐量、延迟或数据规模数字,因此本文不对容量作估算。

安全与合规边界

marimo 涉及代码执行、文件上传、数据库查询、AI 集成和 Web 应用部署,这些能力必须限制在有授权的环境和数据范围内。仓库资料没有声明它是安全沙箱、租户隔离平台或合规托管服务。

  • 代码执行:笔记本可以执行 Python 和 SQL,应只运行来源明确且经过审查的代码。不要在拥有生产密钥或敏感挂载的环境中直接执行不可信笔记本。
  • 网络暴露:Web 服务基于 Uvicorn、Starlette 和 WebSocket 组件,但资料没有给出默认监听地址、认证方式和 TLS 配置。确认访问控制之前,不应将本地编辑服务直接暴露到公网。
  • 文件上传:核心依赖包含 python-multipart>=0.0.18,用于 Starlette 的表单文件上传。文件大小限制、扩展名校验、恶意内容扫描和存储位置未在资料中说明。
  • 数据库权限:SQL 功能应使用最小权限账号,并把开发、测试与生产数据源分离。资料未提供凭据保险库或密钥轮换方案。
  • 隐私数据:向 AI 功能、远程数据库或遥测后端发送内容前,应确认组织政策、数据处理协议和用户授权。项目资料没有提供 GDPR、等保、HIPAA 或其他监管认证声明。
  • 隔离能力:--sandbox 的具体安全边界未被说明,不能据此承诺抵御恶意代码、权限提升或资源耗尽。

纯 Python 文件会进入版本控制,这有利于审查,也意味着硬编码的口令、令牌和个人数据会随提交历史保留。根据本文作者的经验判断,应在提交前使用组织现有的密钥管理和代码扫描流程,并避免把真实凭据写入笔记本源文件。

许可证与商用条款

仓库的 LICENSE 文件声明 Apache License 2.0。该许可证允许在遵守条款的前提下使用、复制、修改、制作衍生作品、公开展示、再许可和分发,因此可以用于商业项目。

Apache-2.0 同时提供符合条款的版权许可与专利许可。资料中的许可证文本还明确规定:如果使用者针对相关作品或贡献发起特定专利诉讼,对该作品授予的专利许可会按许可证条款终止。

分发源代码或对象形式时,需要遵守 Apache-2.0 的再分发要求,包括提供许可证副本、保留适用的版权和归属声明、标注修改,并在仓库包含 NOTICE 且其内容适用时处理相关通知。许可证不等同于商标授权,也不提供适销性、特定用途适用性或无侵权保证。

具体产品是否还包含第三方依赖许可证、商标限制或额外通知,需要对实际发布物进行依赖清单审计。法律解释和再分发文件要求以仓库完整 LICENSE、适用的 NOTICE 文件及专业法律意见为准。

局限性与已知限制

现有资料展示了较完整的能力范围,但没有提供所有兼容性和生产约束。评估时应把“未提供”视为待验证项,而不是默认支持。

  • 未给出响应式依赖分析对动态变量、反射、运行时导入和循环依赖的具体处理规则。
  • 未给出单笔记本规模、单元格数量、数据量、并发会话和 WebSocket 连接数的基准。
  • 未给出生产部署拓扑、身份认证、授权模型、多租户隔离和高可用配置。
  • 未列出 SQL 数据源兼容矩阵、驱动清单、事务行为和查询方言覆盖范围。
  • 未给出 WASM 模式与服务器模式之间的 Python 包、文件系统、网络和性能差异。
  • 未说明 IPYNB 导入或导出的保真度,以及对第三方 Jupyter 扩展的兼容边界。
  • 未提供 AI 功能的数据流图、密钥配置表、模型支持矩阵和隐私承诺。
  • 未提供稳定性级别、长期支持周期、弃用策略、SLA 或商业支持承诺。

此外,版本 0.24.2 来自所给 pyproject.toml 快照,不能据此认定它仍是最新发布版。版本选择、升级路径和安全修复状态应在安装前核对官方仓库和软件包页面。

适合谁

是否采用 marimo,可以根据文件格式、执行模型和交付路径做明确判断。以下信号同时满足得越多,试点价值越高。

  • 团队以 Python 为主要数据或科学计算语言,并要求运行环境至少使用 Python 3.10。
  • 代码审查要求查看普通文本差异,希望笔记本以 .py 文件进入 Git,而不是以 JSON 笔记本文件为唯一事实来源。
  • 交互输入变化后,希望依赖单元格自动更新或明确显示过期状态,以减少执行顺序导致的不一致。
  • 同一分析需要兼顾交互探索、脚本运行、自动测试和 Web 应用展示,不希望长期维护相互分离的实现。
  • 数据工作流需要在 Python 与 SQL 之间切换,并愿意采用 DuckDB、Polars 和 SQLGlot 组成的可选能力。

根据本文作者的经验判断,初次评估应选择一份包含参数输入、数据转换、图表和测试的代表性分析,而不是只验证静态示例。这样才能同时检查响应式重算、Git 差异、依赖安装和应用交付是否符合团队要求。

不适合谁

当组织依赖的能力超出资料确认范围时,不应直接把 marimo 作为既有平台的等价替代。以下条件是需要暂缓采用或先完成专项验证的明确信号。

  • 现有流程强依赖特定 Jupyter 扩展、IPYNB 元数据或 ipywidgets 行为,并要求无修改兼容。
  • 生产平台必须具备已文档化的多租户隔离、细粒度权限、身份单点登录、审计日志和明确 SLA,而当前评估材料中没有这些信息。
  • 运行环境仍停留在 Python 3.9 或更早版本,且无法升级到 >=3.10
  • 应用必须达到已量化的并发、延迟或数据规模目标,但项目资料没有可用于容量规划的 Benchmark。
  • AI 或遥测功能涉及受监管数据,而组织在启用前无法确认数据流、供应商条款、保留周期和跨境处理规则。

对于已有 Streamlit、Jupyter、jupytext、ipywidgets 或 papermill 工作流的团队,根据本文作者的经验判断,应对代表性项目执行并行试点。只有当导入、交互、测试、部署和运维验收全部通过后,才适合制定替换计划。

常见问题与排查(FAQ / Troubleshooting)

排查应先区分核心包、可选依赖和源码开发环境。许多问题来自 Python 版本不满足、功能依赖组未安装,或把前端开发要求误当成普通用户要求。

安装时提示 Python 版本不兼容怎么办

先确认解释器满足 Python >=3.10。项目分类器列出了 3.10 至 3.14;更低版本不符合软件包元数据约束。

import marimo 失败怎么办

确认安装命令与运行脚本使用的是同一个 Python 解释器,可重新执行 python -m pip install marimo。若仍失败,给定资料没有提供专用诊断命令,建议保留完整错误堆栈并查询官方文档或仓库问题记录。

为什么 SQL 功能缺少组件

SQL 依赖不是核心依赖的一部分,需要安装 marimo[sql]。该依赖组包含 DuckDB、Polars 与 SQLGlot;外部数据库需要哪些额外驱动,官方仓库未在所给资料中提供该信息。

使用沙箱后是否可以执行不可信代码

不能根据现有资料得出该结论。资料只说明沙箱管理、每笔记本内核和进程间通信相关依赖,没有声明文件、网络、系统调用或资源层面的安全保证。

Web 应用使用哪个端口

所给 README、pyproject.tomlpackage.json 没有提供默认端口。官方仓库未提供该信息,建议以最新 README 和应用部署文档为准。

如何启用 OpenTelemetry

可以确认 otel 可选依赖存在,也可以安装 marimo[otel]。导出端点、协议选择、采样和环境变量名称没有出现在资料中,因此本文不提供未经核实的配置。

是否支持在浏览器中完全离线运行

README 明确说明支持通过 WASM 在浏览器中运行,并提到本地 HTML-WASM 导出所需的沙箱依赖。离线资源打包方式、可用 Python 包、浏览器限制及网络权限未在给定资料中说明。

可以直接编辑生成的 Python 文件吗

README 表明可以在 VS Code、Cursor、PyCharm、Neovim、Zed 或其他文本编辑器中编辑,并提供文件监视相关指南。为避免破坏生成结构,应先阅读当前版本的编辑与监视文档;资料没有给出哪些区域允许任意修改。

项目地址与资源

以下链接均来自题目提供的仓库信息或 README。版本、命令和兼容性变化应优先通过仓库与正式文档核对。