Как читать Python для циклических выходов в электронном - PullRequest
0 голосов
/ 11 июня 2019

Я разрабатываю приложение Electronjs, которое должно вызывать код Python.Мне нужно прочитать вывод каждой итерации цикла в Python и отобразить его в Electron.Как я могу это сделать?

Я пробовал метод child_process, но он печатает вывод только после завершения всего сценария.Некоторые вещи должны отображаться в конце каждой итерации в скрипте Python.

Пример:

Python:

for i in range(5):
    print(i)

Электрон: --some script--

python_process.on('stdout', function(data_returned){
console.log(data_returned);
console.log('aaa');
});

Желаемый выход: 1

ааа

2

ааа

3

ааа

4

ааа

5

ааа

1 Ответ

0 голосов
/ 13 июня 2019

Подобно этому ответу , вы можете захотеть сбросить вывод, чтобы ваши данные не задерживались в каком-то буфере:

for i in range(5):
    print(i, flush=True)

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

Если ваши фактические данные генерируются с меньшей скоростью, явное сброс может уже быть вашим решением.Следующий пример приводит к отдельным событиям чтения для меня:

import time
for i in range(5):
    print(i, flush=True)
    time.sleep(1)

Если в вашем реальном случае использования все еще может случиться так, что два «сообщения» перевернуты в одном и том же событии, и вы определенно захотите обработать их отдельно, тогда вам просто нужно разделить вывод (например, построчно) и обработать каждое сообщение отдельно.

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

Как вы это реализуете, очень сильно зависит отфактический вывод вашей программы на Python.


Вот код Node.js, который я использовал для тестирования.Он вызывает интерпретатор Python с script.py (это то место, куда пошли бы приведенные выше примеры кода).Код Javascript выводит данные стандартного вывода и отслеживает общее количество событий данных.

const { spawn } = require('child_process')
const myproc = spawn('python', ['script.py'])

let counter = 0

myproc.stdout.on('data', data => {
    console.log(`stdout: ${data}`)
    counter++
})

myproc.on('close', () => {
    console.log(`child process exited after ${counter} read(s)`)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...