Run as a script
You can run marimo notebooks as scripts at the command line, just like
any other Python script. For example,
python my_marimo_notebook.py
Running a notebook as a script is useful when your notebook has side-effects,
like writing to disk. Print statements and other console outputs will show
up in your terminal.
Saving notebook outputs
To run as a script while also saving HTML of the notebook outputs, use
marimo export html notebook.py -o notebook.html
You can also pass command-line arguments to your notebook during export.
Separate these args from the command with two dashes:
marimo export html notebook.py -o notebook.html -- -arg value
Exporting to other formats, such as ipynb, is also possible:
marimo export ipynb notebook.py -o notebook.ipynb -- -arg value
Command-line arguments
When run as a script, you can access your notebook's command-line arguments
through sys.argv
, just like any other Python program. This also
means you can declare your notebook's command-line arguments using Python
libraries like argparse
and simple-parsing
.
These examples shows how to conditionally assign values to variables based on
command-line arguments when running as a script, and use default values when
running as a notebook.
argparse
Source code for examples/running_as_a_script/sharing_arguments.py
Tip: paste this code into an empty cell, and the marimo editor will create cells for you
import marimo
__generated_with = "0.11.31"
app = marimo.App(width="medium")
@app.cell
def _():
import marimo as mo
return (mo,)
@app.cell
def _():
import argparse
return (argparse,)
@app.cell(hide_code=True)
def _(mo):
mo.md(
"""
This notebook shows how to parametrize a notebook with optional command-line arguments.
Run the notebook with
```bash
marimo edit sharing_arguments.py
```
or
```bash
marimo edit sharing_arguments.py -- -learning_rate=1e-3
```
(Note the `--` separating the filename from the arguments.)
or
```bash
python sharing_arguments.py -learning_rate=1e-3
```
See help for the notebook's arguments with
```python
python sharing_arguments.py --help
```
"""
)
return
@app.cell
def _(mo):
default = mo.ui.number(1000, step=100)
default
return (default,)
@app.cell
def _(argparse, default):
parser = argparse.ArgumentParser()
parser.add_argument("-iterations", default=default.value)
args = parser.parse_args()
print(args.iterations)
return args, parser
if __name__ == "__main__":
app.run()
simple-parsing
Source code for examples/running_as_a_script/with_simple_parsing.py
Tip: paste this code into an empty cell, and the marimo editor will create cells for you
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "marimo",
# "simple-parsing==0.1.7",
# ]
# ///
import marimo
__generated_with = "0.11.31"
app = marimo.App(width="medium")
@app.cell
def _():
import marimo as mo
return (mo,)
@app.cell
def _():
import simple_parsing
return (simple_parsing,)
@app.cell
def _():
from dataclasses import dataclass
from simple_parsing import ArgumentParser
parser = ArgumentParser()
parser.add_argument("--foo", type=int, default=123, help="foo help")
@dataclass
class Options:
"""Help string for this group of command-line arguments."""
log_dir: str # Help string for a required str argument
learning_rate: float = 1e-4 # Help string for a float argument
parser.add_arguments(Options, dest="options")
return ArgumentParser, Options, dataclass, parser
@app.cell
def _(Options, mo, parser):
from dataclasses import fields
def parse_args():
if mo.running_in_notebook():
# set default values for the command-line arguments when running as a notebook
return "foo default", Options("logs/", 1e-4)
else:
args = parser.parse_args()
return args.foo, args.options
return fields, parse_args
@app.cell
def _(parse_args):
foo, options = parse_args()
print(foo, options)
return foo, options
if __name__ == "__main__":
app.run()