Взаимодействовать с ноутбуками Jupyter через API - PullRequest
0 голосов
/ 01 февраля 2019

Проблема: я хочу взаимодействовать с Jupyter из другого приложения через Jupyter API, в частности, я хочу, по крайней мере, запускать свои записные книжки из приложения (для меня идеальный вариант - отредактировать некоторые абзацы перед его запуском).Я прочитал документацию по API , но не нашел того, что мне нужно.

Я использовал для этой цели Apache Zeppelin , которые имеют такую ​​же структуру (ноутбукии параграфы).

Кто-нибудь использовал Jupyter для цели, которую я только что описал?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Игнорирование, если использование Jupyter API - лучшее решение проблемы (неясно описано в вопросе), приведенный ниже код выполняет то, о чем вы просили: он будет удаленно выполнять блокнот Jupyter через http и получать некоторые результаты.Это не производство готово, это скорее пример того, как это можно сделать.Не тестировал его с ячейками, которые генерируют много выходных данных - думаю, что он потребует корректировки.

Вы также можете программно изменить / отредактировать код, изменив массив кода.

Вам нужно будет изменитьnotebook_path, base и headers в соответствии с вашей конфигурацией, см. подробности в коде.

import json
import requests
import datetime
import uuid
from pprint import pprint
from websocket import create_connection

# The token is written on stdout when you start the notebook
notebook_path = '/Untitled.ipynb'
base = 'http://localhost:9999'
headers = {'Authorization': 'Token 4a72cb6f71e0f05a6aa931a5e0ec70109099ed0c35f1d840'}

url = base + '/api/kernels'
response = requests.post(url,headers=headers)
kernel = json.loads(response.text)

# Load the notebook and get the code of each cell
url = base + '/api/contents' + notebook_path
response = requests.get(url,headers=headers)
file = json.loads(response.text)
code = [ c['source'] for c in file['content']['cells'] if len(c['source'])>0 ]

# Execution request/reply is done on websockets channels
ws = create_connection("ws://localhost:9999/api/kernels/"+kernel["id"]+"/channels",
     header=headers)

def send_execute_request(code):
    msg_type = 'execute_request';
    content = { 'code' : code, 'silent':False }
    hdr = { 'msg_id' : uuid.uuid1().hex, 
        'username': 'test', 
        'session': uuid.uuid1().hex, 
        'data': datetime.datetime.now().isoformat(),
        'msg_type': msg_type,
        'version' : '5.0' }
    msg = { 'header': hdr, 'parent_header': hdr, 
        'metadata': {},
        'content': content }
    return msg

for c in code:
    ws.send(json.dumps(send_execute_request(c)))

# We ignore all the other messages, we just get the code execution output
# (this needs to be improved for production to take into account errors, large cell output, images, etc.)
for i in range(0, len(code)):
    msg_type = '';
    while msg_type != "stream":
        rsp = json.loads(ws.recv())
        msg_type = rsp["msg_type"]
    print(rsp["content"]["text"])

ws.close()

Полезные ссылки, на основе которых создан этот код (я рекомендую прочитать, если вам нужна дополнительная информация):

Обратите внимание, что существует также https://jupyter -client.readthedocs.io / en / stable / index.html , но, насколько я могу судить, он не поддерживает HTTP как транспорт.

Для справки это работает с ноутбуком 5.7.4, не уверен насчет других версий.

0 голосов
/ 03 февраля 2019

Я считаю, что использование удаленного Jupyter Notebook в вашем случае слишком сложное.

Я вижу хороший способ передать необходимые параметры программе python с каротажем скважин.

...