marimo(マリモ)はJupyterに代わるPythonノートブックツールです。ファイルがJupyterの*.ipynbのようなJSONではなく、そのまま実行できる*.pyです。また、セルの実行順序がグローバル変数の依存関係によって自動的に定まります。
インストールは pip install marimo です。インストールしたら
marimo edit test.py
と打ち込むと、カレントディレクトリの test.py に紐付けられたノートブックがデフォルトのブラウザで開きます。test.py が存在しないか空の場合は、ノートブックも空です。カレントディレクトリに __marimo__ というディレクトリができて、その中にセッション情報が書き込まれます。
最初は空のセルが一つあるはずですので、その中に例えば
3+4
のような計算式を書き込んで、Jupyter や Google Colaboratory と同様に Ctrl + Enter(Macでは ⌘ + Enter)すると、セルが実行され、計算結果 7 が現れます。
ノートブックの下には「PYTHON」「MARKDOWN」「SQL」「GENERATE WITH AI」というボタンがあります。「PYTHON」をクリックすると、Pythonコードを書き込むためのセルが追加されます(あるいは実行する際に Shift + Enter とすれば、実行後に新しいセルができ、そこにカーソルが移ります)。
もう一つやってみましょう。
import sys sys.version
これを同様に実行すると、動いているPythonのバージョン情報が表示されます。
import matplotlib.pyplot as plt
plt.plot([-1, 1])
plt.title("グラフ")
でグラフが出ます。日本語もちゃんと表示されることをご確認ください。
セルに書き込んだ内容は、最初に指定した test.py に自動保存されるはずです(あるいは右側の下にある 💾 のアイコンをクリックすると保存されます)。上の例は、おおよそ次のような感じで保存されます。
import marimo
__generated_with = "0.17.7"
app = marimo.App(width="medium")
@app.cell
def _():
3+4
return
@app.cell
def _():
import sys
sys.version
return
@app.cell
def _():
import matplotlib.pyplot as plt
plt.plot([-1, 1])
plt.title("グラフ")
return
if __name__ == "__main__":
app.run()
marimoの便利な機能として、次のようにスライダーが簡単に作れます。
import marimo as mo slider = mo.ui.slider(1, 10, value=1, label="n") slider
スライダーの値を他のセルで使うと、インタラクティブな図が作れます。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 201)
plt.plot(x, np.sin(slider.value * x))
plt.title(f"sin {slider.value}x")
OpenAI APIなどを設定すると、AIにコードを書いてもらうこともできます。設定内容は、設定ファイル ~/.config/marimo/marimo.toml に保存されます。
終わったら、ノートブックの右上にある×ボタン(Shutdown)で閉じます。シャットダウンせずにブラウザのページを閉じた場合は、最初に打ち込んだコマンド marimo edit test.py は Ctrl + C で停止します。
既存の*.ipynbファイルは marimo convert foo.ipynb -o foo.py でmarimo用Pythonファイルに変換できます。逆は marimo export ipynb foo.py -o foo.ipynb です。marimo convert foo.py -o bar.py で一般のPythonファイルをmarimo用Pythonファイルにすることもできます。
グローバル変数はセルをまたいで意味を持ちますが、JupyterやGoogle Colabと違って、別のセルで再定義することはできません。例えば
x = 2 x = x + 1
は大丈夫ですが、
x = 2
と
x = x + 1
が別のセルにあったらエラーになります。データフレームを表す df なども少しずつ再定義することがよくあるので、要注意です。for i in range(10): のようなループ変数も、i がループ脱出後も残るグローバル変数ですので、別のセルの i とかぶることがよくあります。_ で始まる変数はセル内のローカル変数として扱われますので、for _ in range(10): あるいは for _i in range(10): のようにすれば避けることができます。あるいは、次のようにしてコードを無理矢理ローカルに閉じ込めることもできます。
def _():
# ローカルにしたいコード
_()
!pwd など ! や % で始まるコマンドは使えません。基本的にシェルコマンドは最下部のボタンでターミナルを開いて打ち込み、% で始まるマジックコマンドは Coming from Jupyter の指示に従って書き換える必要があります。関数などのドキュメントの参照は ? が使えないので help(何々) のようにします(たいていはマウスオーバーで簡単な説明が出ます)。
従来のipynbファイルをmarimo形式のPythonファイルに変換するには
marimo convert notebook.ipynb > notebook.py
とします。
最後にuv環境での利用について。uvのドキュメントの Using uv with marimo に詳しいのですが、marimoはプロジェクトに含めずツールとしてインストール(uv tool install marimo)しておいて
uv run --with marimo marimo edit notebook.py
のようにするのが一つの方法です。