如何在Python中读取Python的循环输出

时间:2019-06-11 12:34:03

标签: python node.js electron

我正在开发一个electronjs应用程序,需要调用python代码。我需要在Python中读取循环的每个迭代的输出并将其显示在Electron中。 我该怎么办?

我已经尝试过child_process方法,但是仅在整个脚本结束时才输出输出。我会在python脚本的每次迭代结束时显示一些内容。

示例:

Python:

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

电子: -一些脚本-

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

所需的输出: 1

aaa

2

aaa

3

aaa

4

aaa

5

aaa

1 个答案:

答案 0 :(得分:0)

类似于this answer,您可能需要刷新输出,以使数据不会在某些缓冲区中徘徊:

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代码。它使用script.py调用Python解释器(这是上面的代码示例所要去的地方)。 Javascript代码输出stdout数据,并跟踪数据事件的总数。

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)`)
})