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

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.”
项目速览(TL;DR)
marimo 的核心差异不只是提供浏览器内的代码单元格,而是维护单元格之间的依赖关系,并在输入变化时重新执行相关单元格或将其标记为过期。对于需要版本控制、脚本执行和交互展示共用一份 Python 源文件的项目,它提供了一条连贯路径。
| 项目维度 | 资料中的信息 | 直接影响 |
|---|---|---|
| 保存格式 | 纯 Python 文件 | 可以使用 Git 查看文本差异,也可从其他笔记本导入函数和类 |
| 执行模型 | 响应式依赖执行 | 运行单元格或操作界面元素时,相关下游单元格会执行或被标记为过期 |
| 数据能力 | 一等 SQL 支持、数据框浏览与筛选 | 可在笔记本工作流中查询数据框、数据库、数据仓库或湖仓 |
| 交付形式 | 脚本、交互式 Web 应用、幻灯片和浏览器 WASM | 同一项目可面向开发、自动执行和交互展示 |
| 测试方式 | 支持对笔记本运行 pytest | 笔记本逻辑可以进入自动化测试流程 |
| 许可证 | Apache-2.0 | 允许商用和再分发,但必须履行许可证规定的通知与分发义务 |
README 将 marimo 描述为可覆盖 jupyter、streamlit、jupytext、ipywidgets 和 papermill 等工具部分职责的完整环境。这是项目自身的定位陈述,不代表所有 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.0、polars[pyarrow]>=1.9.0 和 sqlglot[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 服务 | uvicorn、starlette、websockets |
提供 Web 服务器、Web 框架、实时通信及语言服务器相关 WebSocket 支持 |
| 内容处理 | markdown、pymdown-extensions、pygments、docutils |
处理 Markdown、扩展语法、代码高亮和 RST 解析 |
| 编辑辅助 | jedi |
提供代码补全能力 |
| 配置与元数据 | tomlkit、pyyaml、packaging |
读写配置、处理 Markdown 前置元数据和版本信息 |
| 数据抽象 | narwhals>=2.0.0 |
支撑数据框相关能力 |
| 协作与进程通信 | loro、pyzmq |
分别用于协作编辑,以及沙箱内核和多笔记本运行所需的进程间通信 |
| 资源信息 | psutil>=5.0 |
展示内存、CPU 和其他系统资源信息 |
| 前端工程 | pnpm、turbo、vitest、oxfmt |
承担前端开发、构建、测试、类型检查和格式化任务 |
构建后端是 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 环境。
uvicorn、starlette和websockets等依赖通过平台条件排除 Emscripten。loro与psutil在 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 执行,包括
typecheck、test、build和codegen。
官方仓库未在给定资料中提供操作系统最低版本、浏览器最低版本、CPU 架构矩阵和最低内存要求,建议以最新 README、发行说明和软件包元数据为准。
快速开始:安装、运行与验证
README 给出的最短入口是通过 pip 安装,然后打开内置入门教程。下面的命令只用于本地或隔离测试环境,不包含远程部署和公网暴露。
步骤一:安装并启动教程
python -m pip install marimo
marimo tutorial intro第一条命令安装名为 marimo 的 Python 包;第二条命令来自 README,用于运行 intro 教程。资料没有说明该命令使用的端口、监听地址或浏览器启动规则,因此不应预设固定端口。
步骤二:创建最小本地验证脚本
import marimo
print(marimo.__name__)将以上内容保存为 verify_marimo.py,再执行下列命令。该验证只检查当前 Python 环境能否导入已安装的软件包,不代表 SQL、AI、沙箱或 Web 应用功能已经安装完毕。
python verify_marimo.py预期输出为 marimo。至此形成“安装软件包、运行官方教程、导入并验证包名”的最小闭环;由于所给资料没有提供 marimo 笔记本文件的生成代码模板,本文不手写未核实的装饰器或单元格 API。
启用 SQL 可选依赖
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.0与python-lsp-ruff>=2.0.0。mcp:包含httpx2>=2.5.0,<3与mcp>=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 用于每笔记本沙箱内核的进程间通信。
python -m pip install "marimo[sandbox]"
marimo edit --sandbox DIRECTORYDIRECTORY 应替换为本地测试目录。资料没有说明沙箱的文件系统权限、网络隔离级别、系统调用边界和资源配额,因此不能把该功能等同于完整的安全容器。
从笔记本到工程资产
- 将稳定的函数和类保留在可导入的 Python 笔记本中,供其他笔记本复用。
- 使用 README 所述的 pytest 支持,为关键转换、计算和参数边界建立测试。
- 需要无人值守执行时,使用脚本模式和命令行参数化能力,而不是依赖人工操作 UI。
- 需要展示交互结果时,再使用应用或幻灯片交付路径。
- 需要 IPYNB 交换格式时,安装包含 nbformat 的推荐依赖并验证导出结果。
上述流程中的具体测试命令、部署命令、脚本参数声明和 IPYNB 导出命令未包含在给定资料中。官方仓库未提供该信息,建议以最新 README 和对应指南为准。
AI 与编辑器集成边界
README 将 marimo 定位为面向 AI 的现代编辑器,支持与 Claude Code 等代理配合,也提供内置 AI 功能和 GitHub Copilot 集成。资料只能确认功能入口存在,不能确认每一种模型、地区和账户类型均可使用。
在依赖层面,推荐依赖包含带 OpenAI 扩展的 pydantic-ai-slim,而 MCP 可选依赖包含 mcp 与 httpx2。AI 请求的数据范围、提示词记录方式、遥测、供应商保留政策、密钥变量名和企业数据处理协议均未在所给资料中披露。
根据本文作者的经验判断,处理源代码、客户数据或内部数据库前,应先确认实际启用的 AI 提供方、请求目标、日志策略和组织授权。未完成审查时,可以只使用本地编辑与计算能力,不配置外部模型凭据。
可观测性与运维
项目具备系统资源展示和 OpenTelemetry 可选集成的依赖基础,但所给资料不足以形成完整生产运维手册。可确认的范围是 CPU、内存等系统信息,以及 OTLP HTTP 和 gRPC 导出组件。
核心依赖中的 psutil>=5.0用于展示 RAM、CPU 使用情况和其他系统工具信息。otel 额外依赖使用 opentelemetry-api~=1.28.0、opentelemetry-sdk~=1.28.0,并提供 OTLP HTTP 与 gRPC 导出器。
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.toml 和 package.json 没有提供默认端口。官方仓库未提供该信息,建议以最新 README 和应用部署文档为准。
如何启用 OpenTelemetry
可以确认 otel 可选依赖存在,也可以安装 marimo[otel]。导出端点、协议选择、采样和环境变量名称没有出现在资料中,因此本文不提供未经核实的配置。
是否支持在浏览器中完全离线运行
README 明确说明支持通过 WASM 在浏览器中运行,并提到本地 HTML-WASM 导出所需的沙箱依赖。离线资源打包方式、可用 Python 包、浏览器限制及网络权限未在给定资料中说明。
可以直接编辑生成的 Python 文件吗
README 表明可以在 VS Code、Cursor、PyCharm、Neovim、Zed 或其他文本编辑器中编辑,并提供文件监视相关指南。为避免破坏生成结构,应先阅读当前版本的编辑与监视文档;资料没有给出哪些区域允许任意修改。
项目地址与资源
以下链接均来自题目提供的仓库信息或 README。版本、命令和兼容性变化应优先通过仓库与正式文档核对。



