如何从nodejs实时发送stdout到angularjs?

时间:2015-06-15 09:25:14

标签: javascript python angularjs node.js

我有一个运行很长时间的脚本。它会生成一个输出。我正在使用child_process从nodejs运行此脚本。如何在开始执行时尽快发送此脚本的输出,并且不要等待脚本完成。我目前有的代码等待脚本完成,然后在nodejs控制台上一次输出所有stdout。

示例脚本:

import time

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

nodejs代码:

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,直到子进程停止为止?

1 个答案:

答案 0 :(得分: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()