Подобно этому ответу , вы можете захотеть сбросить вывод, чтобы ваши данные не задерживались в каком-то буфере:
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)`)
})