В предыдущих эпизодах мы создали:
- 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”