Рубрики
Без рубрики

Электронные приключения: эпизод 59: ноутбук Python Engine

В предыдущих эпизодах мы создали: HTTP-на основе Ruby Language Server HTTP-языком Python … Помечено JavaScript, Electronic, React, Python.

В предыдущих эпизодах мы создали:

  • HTTP-сервер на основе ruby
  • HTTP-сервер на основе Python Language
  • на основе процесса Ruby Language Server

Итак, теперь пришло время создать процесс Python на основе процесса.

Мы будем воспринимать всю интерфейс из предыдущего эпизода – кроме изменения имени сценариев, которого мы запускаем RUBY_LANGUAGE_SERVER к python_language_server И замена примеров Ruby Code примерами Python.

Весь новый код будет Python.

python_language_server.

#!/usr/bin/env python3

from io import StringIO
import sys
import json

class Capturing(list):
    def __enter__(self):
        self._stdout = sys.stdout
        self._stderr = sys.stderr
        self._stringio = StringIO()
        sys.stdout = self._stringio
        sys.stderr = self._stringio
        return self
    def __exit__(self, *args):
        output = self._stringio.getvalue()
        self.append(output)
        sys.stdout = self._stdout
        sys.stderr = self._stderr

sessions = {}

for line in sys.stdin:
    body = json.loads(line)
    session_id = body["session_id"]
    code = body["code"]
    sessions.setdefault(session_id, {})
    error = None
    with Capturing() as output:
        try:
            exec(code, sessions[session_id])
        except Exception as e:
            error = str(e)
    result = {"output": output[0], "error": error}
    print(json.dumps(result), flush=True)

Там очень мало новых. У нас уже был весь код для выполнения кода и захвата вывода в версии колба.

Нам просто нужно:

  • Прочитайте вход с для линии в Syssstn
  • разбирать его с body.loads (линия)
  • Распечатайте результат с Печать (json.dumps (результат),)

Flush = Правда Важно, поскольку связь между процессами обычно буферизается, поэтому он не будет отправлен до тех пор, пока буфер 4 КБ не будет заполнен. Эта буферизация не происходит, если вы печатаете к терминалу, и обычно если вы отправляете вещи для файлов, вам не волнует точное время, когда каждая строка попадает там. Но когда говорить с процессами, нам нужно сделать это.

Нам не нужно делать какие-либо хитрости на входе, так как только процесс отправки может потенциально иметь такой буфер.

Результат

Вот результат, если мы нажмем кнопку «Запустить все»:

Все было очень легко, поскольку мы в основном просто объединили то, что мы сделали в предыдущих двух эпизодах.

В следующем эпизоде мы сделаем что-то немного сложнее и попробуйте сделать то же самое для языка, который вы, возможно, не слышали некоторое время. И мы также переместим контроль сеанса в электронную сторону.

Как обычно, весь код для эпизода здесь Отказ

Оригинал: “https://dev.to/taw/electron-adventures-episode-59-notebook-python-engine-1e79”