如何实时将Node.js的标准输出发送到AngularJS?

3

我有一个长时间运行的脚本,它会生成一个输出。我使用child_process在nodejs中运行这个脚本。如何在脚本开始执行时发送输出,并且不等待脚本完成。我目前拥有的代码会等待脚本完成,然后将所有stdout一次性输出到nodejs控制台。

示例脚本:

import time

if __name__ == '__main__':
    for i in range(5):
        time.sleep(1)
        print("Hello how are you " + str(i))

Node.js 代码:

var spawn = require('child_process').spawn,
    ls    = spawn('python', ['path/test.py']);

ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

ls.on('close', function (code) {
  console.log('child process exited with code ' + code);
});

console.log 等待脚本完成后输出结果。

Hello how are you 1
Hello how are you 2
Hello how are you 3
Hello how are you 4
Hello how are you 5

一次性发送stdout。有没有办法在子进程停止之前立即发送正在写入的stdout?


你在这里会遇到缓冲问题。 - James Mills
1
Python的输出是有缓冲区的吗?尝试在每个“print”后使用“flash”(刷新)它,“import sys”和“sys.stdout.flush()”。 - befzz
不是 Python 的输出被缓冲了(但您可以刷新它),操作系统也会缓冲输出!阅读:https://www.turnkeylinux.org/blog/unix-buffering - James Mills
我理解node的spawn和exec之间的区别。 - Abhishek Kusnoor
1个回答

0

简短的回答是:

您需要以非缓冲模式重新打开 sys.stdout

示例:

import os
import sys

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

那么你的程序将会是这样的:

import os
import sys
import time

if __name__ == '__main__':
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

    for i in range(5):
        time.sleep(1)
        sys.stdout.write("Hello how are you " + str(i))
        sys.stdout.flush()

谢谢。您能否给我一些见解,告诉我如何以同样的方式将响应发送到前端?每行输出后,都要进行res.send或res.write。它总是等待脚本完成,然后发送整个块。我该如何实时处理? - Abhishek Kusnoor
你想在哪种服务器技术和框架下实现这个解决方案?(这可能最好作为一个单独的问题来问!) - James Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接