Metadata-Version: 2.4
Name: kunda
Version: 0.0.2
Summary: the vessel that holds live kernels: which interpreter each burns in, and how many stay alight
Author-email: Karthik Rajgopal <karthik.rajgopal@hotmail.com>
License: Apache-2.0
Project-URL: Repository, https://github.com/vedicreader/kunda
Project-URL: Documentation, https://vedicreader.github.io/kunda
Keywords: jupyter,kernel,ipykernel,ipymini,venv
Classifier: Natural Language :: English
Classifier: Intended Audience :: Developers
Classifier: Development Status :: 3 - Alpha
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: fastcore>=1.8.17
Requires-Dist: jupyter-client>=8.6
Requires-Dist: ipykernel>=6.29
Requires-Dist: ipymini>=0.1.17
Requires-Dist: dhrishti>=0.1.4
Requires-Dist: jupygate>=0.0.1
Requires-Dist: jupyasyncclient!=0.2.8,>=0.2.1
Requires-Dist: jupywire>=0.1.1
Dynamic: license-file

# Kunda


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

## Install

``` sh
pip install kunda
```

## Select an interpreter

``` python
from kunda import python_for, find_pythons, venv_env

python_for('~/code/myrepo/src', stop='~/code/myrepo')
find_pythons(roots=['~/code'], current=...)
venv_env(python)
```

[`python_for`](https://vedicreader.github.io/kunda/pythons.html#python_for) searches parent folders up to `stop`. It then uses the supplied default or a virtual environment under `roots`. `None` means the current interpreter.

[`venv_env`](https://vedicreader.github.io/kunda/pythons.html#venv_env) removes frozen-host interpreter variables before starting the child.

## Run one kernel

``` python
from kunda import Kernel

k = Kernel(cwd='~/code/myrepo', python=..., kernel='ipymini')
await k.start()
out = await k.execute('df.head()', on_output=print)
out.ok, out.text, out.execution_count
await k.complete('df.he', 5)
await k.restart()
await k.shutdown()
```

[`ExecOutcome`](https://vedicreader.github.io/kunda/spec.html#execoutcome) contains execution errors and leaves the kernel available. [`missing_kernel_module`](https://vedicreader.github.io/kunda/spec.html#missing_kernel_module) reports a missing launcher after startup fails. Local kernels use `jupyter_client`; gateway kernels use the same interface over WebSocket.

## Keep several kernels alive

``` python
from kunda import KernelPool, RuntimeBroker

pool = KernelPool(broker=RuntimeBroker(max_kernels=12), idle=30*60)
k = await pool.get('notebook-1', cwd=..., python=..., inspect=True)
pool.peek('notebook-1')
await pool.close('notebook-1')
await pool.close_all()
```

Each key has at most one kernel. The pool discards failed starts and keeps busy kernels. `idle=0` disables reaping.

[`RuntimeBroker`](https://vedicreader.github.io/kunda/pool.html#runtimebroker) enforces a process-wide limit. A host can also provide runners and known kernelspecs for other languages.

``` python
KernelPool(runner_for=lambda lang: MyRustRunner if lang == 'rust' else None,
           known_kernels={'julia': 'julia-1.10'})
```

## Install kernel support

``` python
from kunda import kernel_support, install_kernel_support, installable

kernel_support(python)
installable(python)
install_kernel_support(python)
```

Installation uses the host’s installed package versions. It fails when either launcher still cannot import.

## Inspect live variables

With `inspect=True`, Kunda starts Dhrishti inside the kernel and reads its registry. A matching Python minor version uses the host package. Other versions use the project installation.
