Это мой первый проект с 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
не работает, потому что поток закончился. Но если я не закончу поток, он даже не запустится. После долгого поиска я все еще не могу найти достойного решения. Было бы здорово, если бы кто-нибудь мог указать мне правильное направление. Спасибо!