Show HN:Marimo——适用于 Python 的开源响应式笔记本
一个名为 Marimo 的开源项目正在定位为面向 Python、具有响应式特性的 Jupyter 笔记本替代方案,旨在通过将笔记本保存为纯 `.py` 文件并自动跟踪单元依赖,来解决长期存在的隐藏状态、非确定性执行和版本控制不佳等问题。评论者对它将探索式工作与易于分享为应用程序结合起来的能力表示热情,并欣赏依赖图、变量查看器,以及计划中的 WASM、调试和 lint/格式化工具等集成。与此同时,他们也指出了灵活性方面的取舍、在完全可复现环境和包管理上的不完整方案、一些状态跟踪边缘情况,以及仍需成熟的编辑器集成粗糙之处。
与现有工具的定位对比
- 被视为 Jupyter/Pluto/Observable 的替代方案,具有响应式单元格和纯
.py文件格式。 - 许多人希望网站上有更清晰的顶层“Jupyter vs Marimo”表述,而不只是放在 FAQ 里。
- 与 Streamlit 相比:Marimo 先支持经典笔记本式探索,然后可导出为可分享的应用。
- 提到 Quarto 解决了一些可复现性问题,但 Marimo 的同步响应式单元格被强调为主要差异点。
响应性、状态与可复现性
- 主要吸引力:通过依赖 DAG 对单元格进行拓扑排序,并在变更时重新运行受影响的单元格,从而消除隐藏状态。
- 用户喜欢它提升了确定性,并让笔记本更易于推理和审阅(因为它们就是普通 Python)。
- 也有人觉得它灵活性较低:他们有时希望调整某个单元格而不触发下游重新计算。
- 状态跟踪并不完美:例如在 dataclass 上进行
d.x = "new value"这样的修改,目前不会导致依赖单元格重新运行。
打包与环境
- 许多人认为包/环境捕获是可复现性的“另一半”,并希望笔记本能嵌入依赖信息。
- Marimo 路线图上有“用于可复现笔记本的包管理”,但目前还没有具体设计。
- 关于
pip freeze工作流的讨论指出了一些问题:非 pip 安装、平台特定变体、臃肿/过时依赖,以及手动维护。 - 还提到了 Poetry、pip-tools 和 Nix 等替代方案;对于 Python 打包到底有多痛苦,各方看法不一。
部署、WASM 与应用
- 人们对类似 JupyterLite 的 WASM/pyodide 模式很感兴趣,希望能在浏览器中执行、嵌入到 MDX/Nextcloud,并生成“独立 HTML”应用。
- WASM 支持已明确列入路线图;当前文档嵌入使用的是 iframe。
- 用户喜欢能把笔记本变成简单的 Web 应用,适合内部工具和交互式教程。
编辑器集成与 UX
- 已有 VS Code 扩展,但目前会打开完整的浏览器界面,而不是使用 VS Code 原生的 notebook 界面;有些人觉得上手过程令人困惑。
- 有人询问能否在外部编辑器中编辑
.py笔记本并看到实时更新;这是期望中的功能,但尚未支持。 - 用户还询问关闭标签页后是否能保留长期运行的后台任务;当前行为并不明确。
插件、小部件与功能
- 内部小部件系统使用自定义元素;目前没有公开的插件 API,但计划提供。
- 该工具从零构建,不依赖 Jupyter 或 IPython;Jupyter widget 兼容性目前也只是一个想法。
- 现有功能包括依赖图查看器、变量查看器、Copilot 集成,以及基于 PDB 的调试和更好的图可视化计划。
- 需求包括:markdown 中的 mermaid 图、类似 RStudio 的“感知文档”补全(据称已存在)、更好的 GitHub 预览、单元级缓存,以及更细致的变量作用域(例如用于重复绘图代码)。