Skip to main content

A little wrapper around `uv` to launch ephemeral Jupyter notebooks.

Project description

juv

A little wrapper around uv to launch ephemeral Jupyter notebooks.

uvx juv
# A wrapper around uv to launch ephemeral Jupyter notebooks.
#
# Usage: juv [uvx flags] <COMMAND>[@version] [PATH]
#
# Commands:
#   init: Initialize a new notebook
#   add: Add dependencies to the notebook
#   lab: Launch notebook/script in Jupyter Lab
#   notebook: Launch notebook/script in Jupyter Notebook
#   nbclassic: Launch notebook/script in Jupyter Notebook Classic
#   version: Display juv's version
#   info: Display juv and uv versions
#
# Examples:
#   juv init foo.ipynb
#   juv add foo.ipynb numpy pandas
#   juv lab foo.ipynb
#   juv nbclassic script.py
#   juv --python=3.8 notebook@6.4.0 foo.ipynb

Scripts will be converted to notebooks before launching the Jupyter session.

uvx juv lab script.py # creates script.ipynb

Any flags that are passed prior to the command (e.g., uvx juv --with=polars lab) will be forwarded to uvx as-is. This allows you to specify additional dependencies, a different interpreter, etc.

what

PEP 723 (inline script metadata) allows specifying dependencies as comments within Python scripts, enabling self-contained, reproducible execution. This feature could significantly improve reproducibility in the data science ecosystem, since many analyses are shared as standalone code (not packages). However, a lot of data science code lives in notebooks (.ipynb files), not Python scripts (.py files).

juv bridges this gap by:

  • Extending PEP 723-style metadata support from uv to Jupyter notebooks
  • Launching Jupyter sessions with the specified dependencies

It's a simple Python script that parses the notebook and starts a Jupyter session with the specified dependencies (piggybacking on uv's existing functionality).

alternatives

juv is opinionated and might not suit your preferences. That's ok! uv is super extensible, and I recommend reading the wonderful documentation to learn about its primitives.

For example, you can achieve a similar workflow using the --with-requirements flag:

uvx --with-requirements=requirements.txt --from=jupyter-core --with=jupyterlab jupyter lab notebook.ipynb

While slightly more verbose and breaking self-containment, this approach totally works and saves you from installing another dependency.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

juv-0.1.5.tar.gz (28.8 kB view details)

Uploaded Source

Built Distribution

juv-0.1.5-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file juv-0.1.5.tar.gz.

File metadata

  • Download URL: juv-0.1.5.tar.gz
  • Upload date:
  • Size: 28.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for juv-0.1.5.tar.gz
Algorithm Hash digest
SHA256 c215a953ae1ff67f46b82516762fdf082d07010d931e69023d2008ec3c6ee0fb
MD5 961e9136f9f8fa5ccce243a2e9134fef
BLAKE2b-256 4bd345a34fab0c2d1012ab49765b11c6d095d629a8b79f5e2e6e5c284f185b22

See more details on using hashes here.

File details

Details for the file juv-0.1.5-py3-none-any.whl.

File metadata

  • Download URL: juv-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 6.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for juv-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 c43af5f8a498ceecd51afec995e15179405b8141b70f468a839811477530b55b
MD5 847cdf2d1b98a4241b1db85caff3aef5
BLAKE2b-256 8b041c7445b71b494fed6714e261a08251a8791696eef82e20902b01e03c9459

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page