Goal: Enable real-time interaction with a Jupyter Notebook by sharing the same kernel
between Python code (CLI/script) and the Jupyter Notebook UI.
Use case: Allow a script to interact with variables defined in the Jupyter Notebook interface, and vice versa. Example:
- In the Notebook UI, define a variable:
x = 2
. - From Python script/CLI, run a function that executes
print(x)
. - Expected output:
2
- confirmation that the kernel sharing works.
Attempts: Started Jupyter Lab
using collaborative
mode (command: jupyter lab --no-browser --IdentityProvider.token=eere --ip=0.0.0.0 --port=14484 --collaborative
). Then, execute the code below:
from jupyter_nbmodel_client import NbModelClient, get_jupyter_notebook_websocket_url
from jupyter_kernel_client import KernelClient
SERVER_URL = "http://localhost:14484"
TOKEN = "eere"
NOTEBOOK_PATH = "~/Documents/envs/test/kernel_test.ipynb"
cell_content = "print(x)"
kernel = KernelClient(server_url=SERVER_URL, token=TOKEN)
kernel.start()
notebook = NbModelClient(
get_jupyter_notebook_websocket_url(server_url=SERVER_URL, token=TOKEN, path=NOTEBOOK_PATH)
)
await notebook.start()
cell_index = notebook.add_code_cell(cell_content)
notebook.execute_cell(cell_index, kernel)
Code output:
Websocket client stopped.
Traceback (most recent call last):
File "~Documents/envs/test/.really_delete/lib/python3.10/site-packages/jupyter_nbmodel_client/client.py", line 86, in _listen_to_websocket
async for message in websocket:
File "~Documents/envs/test/.really_delete/lib/python3.10/site-packages/websockets/asyncio/connection.py", line 242, in __aiter__
yield await self.recv()
File "~Documents/envs/test/.really_delete/lib/python3.10/site-packages/websockets/asyncio/connection.py", line 322, in recv
raise self.protocol.close_exc from self.recv_exc
websockets.exceptions.ConnectionClosedError: sent 1002 (protocol error) invalid status code; no close frame received
Document ws://localhost:14484/api/collaboration/room/json:notebook:54aee93a-b50f-4190-820f-c5306b218eb8?sessionId=7781e065-b341-4f85-8a56-f4caa4190de6&token=eere not yet synced.
{'execution_count': 1,
'outputs': [{'output_type': 'error',
'ename': 'NameError',
'evalue': "name 'x' is not defined",
'traceback': ['\x1b[0;31m---------------------------------------------------------------------------\x1b[0m',
'\x1b[0;31mNameError\x1b[0m Traceback (most recent call last)',
'Cell \x1b[0;32mIn[1], line 1\x1b[0m\n\x1b[0;32m----> 1\x1b[0m \x1b[38;5;28mprint\x1b[39m(\x1b[43mx\x1b[49m)\n',
"\x1b[0;31mNameError\x1b[0m: name 'x' is not defined"]}],
'status': 'error'}
After the WS error, the x
name is not defined in the above error:
"\x1b[0;31mNameError\x1b[0m: name 'x' is not defined"]}],
Any help is more than welcome!!
x = 2
before you execute cell withprint(x)
x = 2
should be in declared in the UI. Then, theprint(x)
will be added by the code. The code, ideally, connects to the kernel and retrievex
.