我正在开发一个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
答案 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)`)
})