Как я могу напечатать вывод в обработчике сообщений Jupyter Notebook на стороне Python? - PullRequest
0 голосов
/ 05 октября 2018

Моя цель: я хочу настроить сообщение comm, отправить сообщение из JS в Python и заставить код Python напечатать сообщение в ячейке Jupyter.

Я следовал инструкциям по созданиюcomm для отправки сообщений между кодом расширения Python и кодом расширения JS:

https://jupyter -notebook.readthedocs.io / en / stable / comms.html

Вот что они предлагают использовать - сначала код JS:

Jupyter.notebook.kernel.comm_manager.register_target('my_comm_target',
function(comm, msg) {
    // comm is the frontend comm instance
    // msg is the comm_open message, which can carry data

    // Register handlers for later messages:
    comm.on_msg(function(msg) {...});
    comm.on_close(function(msg) {...});
    comm.send({'foo': 0});
});

Далее код Python:

from ipykernel.comm import Comm

# Use comm to send a message from the kernel
my_comm = Comm(target_name='my_comm_target', data={'foo': 1})
my_comm.send({'foo': 2})

# Add a callback for received messages.
@my_comm.on_msg
def _recv(msg):
    # Use msg['content']['data'] for the data in the message

После выполнения этих двух по порядку я понимаю, что код Pythonотправляет сообщение comm_open, которое отправляется функции JS (comm, msg), которая затем устанавливает обработчики и отправляет {'foo': 0'} обратно в код Python, который затем запускает _recv.

Я хочу иметь возможностьвыводить что-либо через код Python, например, print, log, IPython.display.display () и т. д. Однако на этой странице кажется, что код _recv выполняется в канале оболочки IPython, что, по-видимому, не допускает никаких побочных эффектов.- печать, ipdb,или что-нибудь еще.https://jupyter -client.readthedocs.io / en / latest / messaging.html # custom-messages

Лучшее, что я мог получить, это raise Exception(msg), который показал трассировку в ядре Jupyterвывод в терминале, но это не помогает мне регистрировать происходящее и не позволяет писать сообщения в выходные ячейки Jupyter.

Есть ли способ переключить контекст обратно на канал IOPub из _recv или отправитьпи-пи-пи сообщение для запуска в этом контексте?Это позволило бы мне установить breakpoint() и т. Д. Или любое другое решение этой проблемы.Спасибо:)

...