Электрон с Python Backend: Как повторно передавать данные из JS в Python - PullRequest
0 голосов
/ 09 апреля 2020

Это мой первый проект с Electron, так что все еще довольно новый для всего этого. Я пытаюсь создать настольное приложение, используя Python для серверной части. У меня проблема с передачей данных между Javascript и Python.

По сути, идея заключается в том, что когда пользователь нажимает кнопку, запускается сценарий Python и значение передается из Javascript. Когда пользователь нажимает другую кнопку, передается новое текстовое значение.

Javascript родительский процесс

const {PythonShell} =  require('python-shell');

function testSpawn(evt){
    if (evt.srcElement.id == "btnSpawnProcess"){
        childShellProcess.stdin.write('Some Text')
        childShellProcess.stdin.end()

        shellProcess.on('message', function (message) {
            console.log(message)
        });
    } else if (evt.srcElement.id == "btnEditProcess"){
        childShellProcess.stdin.write('Some Other Text')
        childShellProcess.stdin.end()
    }
}

var options = {mode: 'json'};
var shellProcess = new PythonShell('./model/testSpawn.py', options);
childShellProcess = shellProcess.childProcess;

document.addEventListener('DOMContentLoaded', function() {
    document.getElementById("btnSpawnProcess").addEventListener("click", testSpawn);
    document.getElementById("btnEditProcess").addEventListener("click", testSpawn);
});

Python дочерний процесс

import sys
import json
import csv
import time

message = sys.stdin.readline()

# Print 100x the message that is being passed
for i in range(100):
    print(json.dumps(message, ensure_ascii=False))
    sys.stdout.flush()
    time.sleep(1)  # Delay 1 sec

Желаемый вывод консоли должен быть

Some Text     # 1 s timeout
Some Text     # 1 s timeout
Some Text     # 1 s timeout
Some Other Text     # After triggering the btnEditProcess button
...

Вместо этого я получаю

Some Text     # 1 s timeout
Some Text     # 1 s timeout
Some Text     # 1 s timeout
Uncaught Error [ERR_STREAM_WRITE_AFTER_END]: write after end   # After triggering the btnEditProcess button
Some Text     # 1 s timeout
Some Text     # 1 s timeout
...

К сожалению, код не работает. Я думаю, что мой подход с использованием stdin не работает, потому что поток закончился. Но если я не закончу поток, он даже не запустится. После долгого поиска я все еще не могу найти достойного решения. Было бы здорово, если бы кто-нибудь мог указать мне правильное направление. Спасибо!

...