Skip to main content

jupyasyncclient

jupyasyncclient is an async Python client for running code on Jupyter kernels. It connects to servers that implement the standard kernels API, including rustygate, jupygate, and jupyter_server.

Kernel creation, interruption, restart, and deletion use HTTP. Each client exchanges messages over one websocket. Sends await the websocket transport. The client does not depend on zmq or tornado.

Three classes provide jupyter_client-style interfaces:

  • JupyAsyncKernelClient manages one kernel’s lifecycle, channels, and messages.
  • JupyAsyncKernelManager starts and stops one kernel and creates clients for it.
  • JupyAsyncMultiKernelManager manages multiple kernels. ensure_kernel('some-key') returns the live kernel registered under that key or starts one.

The core notebook builds the client bottom-up and demonstrates every method against a live server. The managers are HTTP wrappers in plain modules. Two other notebooks cover gateway APIs:

JupyAsyncCellsClient.view returns selected cells with the current notebook path and requested metadata. cells returns the selected cell list. Both accept a filename or a kernel binding through the client constructor.

Install

pip install jupyasyncclient

You also need a kernel server. These examples use rustygate serving ipymini kernels. The test suite also runs against a stock jupyter_server.

Use

The client’s execute, complete, inspect, history, kernel_info, and wait_for_ready methods follow their jupyter_client namesakes. Choose how to receive execution results:

  • execute sends without waiting for a reply.
  • reply awaits one execute_reply.
  • run collects every message caused by an execution.

Every inbound message also reaches the on_jmsg callback once, in receive order, after request routing. The callback can be synchronous or asynchronous. The reader awaits it before taking the next message. Do not await replies on the same websocket from the callback. JmsgQueues provides queues for applications that need to pull the same messages instead.

Every protocol *_request type is callable by name and returns an awaitable for its reply. This includes subshell requests. New protocol messages do not require a client release.

Messages are standard Jupyter dictionaries with a channel key. The server handles zmq-specific behaviour, including sync-send edge consumption, slow-joiner subscriptions, and socket identity.

import asyncio
from rustygate.tools import start_gateway
g = start_gateway()
g
<Gateway http://127.0.0.1:60487 pid=47781 up>

start_new_server_kernel starts a kernel and returns its manager and a ready client. This example uses a single jmsg queue for iopub and stdin messages:

km, kc = await start_new_server_kernel(g.url)
qs = JmsgQueues(kc, queues=('jmsg',), merge=dict(iopub='jmsg', stdin='jmsg'))
rep = await kc.reply("print('hello'); 6*7", timeout=30)
rep['content']['status']
'ok'

Kernel output arrives on the iopub channel. Read the stream message from the queue:

m = await qs.jmsg_for('stream', timeout=15)
m['content']['text']
'hello\n'

Calling input() in the kernel produces an input_request on the stdin channel. Answer with the client’s input method. It sets the reply’s parent to the request:

fut = asyncio.ensure_future(kc.reply("name = input('who? ')", timeout=30))
prompt = await qs.jmsg_for('input_request', timeout=15)
kc.input('Jeremy')
(await fut)['content']['status']
'ok'

Call protocol requests by name and await their replies. This example creates and deletes a JEP 91 subshell:

sub = (await kc.create_subshell(timeout=15))['content']['subshell_id']
rep = await kc.reply('40+2', timeout=30, subshell_id=sub)
await kc.delete_subshell(sub, timeout=15)
rep['content']['status']
'ok'

Use the multimanager to keep a kernel for each named task. Repeated calls to ensure_kernel with the same key reuse its live kernel:

mkm = JupyAsyncMultiKernelManager(g.url)
k1 = await mkm.ensure_kernel('analysis')
k2 = await mkm.ensure_kernel('analysis')
k1 == k2
True
await kc.aclose()
await km.shutdown_kernel()
await mkm.shutdown_all()

Pass token=... to any of the three classes when the server requires a bearer token. HTTP requests send it in the Authorization header. Websocket connections send it as a query parameter.

Metadata

Release files for jupyasyncclient 0.2.21

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jupyasyncclient 0.2.21
File Size Uploaded Provenance Actions
jupyasyncclient-0.2.21.tar.gz 19.9 kB Without provenance Details for jupyasyncclient-0.2.21.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for jupyasyncclient 0.2.21
File Interpreter ABI Platform Actions
jupyasyncclient-0.2.21-py3-none-any.whl Python 3 none any Details for jupyasyncclient-0.2.21-py3-none-any.whl

Total release size: 39.7 kB

Release files / jupyasyncclient-0.2.21.tar.gz

Download URL jupyasyncclient-0.2.21.tar.gz
Size 19.9 kB
Tags Source
SHA-256 checksum
How to use checksums
885509ccceb20010bb50d3f053c112d807efbbadb5084f0b086604e66b4c02aa
BLAKE2b-256 checksum
How to use checksums
b817278c505af31beaeda4ed69f205315fe92c636ee9420ebab8baef28f6df27
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.15

Release files / jupyasyncclient-0.2.21-py3-none-any.whl

Download URL jupyasyncclient-0.2.21-py3-none-any.whl
Size 19.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0ab21b8933ab15a0ee2add04b4cdddd7154da33027daa58e282c999f0b77e073
BLAKE2b-256 checksum
How to use checksums
b15ebe4d73714cf2f38ea117cc2024241750f91dc5a2220e686729ec02aea8f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.15

Security for jupyasyncclient 0.2.21

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page