【问题标题】:How do I send stdout in real time from nodejs to angularjs?如何将标准输出从nodejs实时发送到angularjs?
【发布时间】:2015-08-30 17:45:57
【问题描述】:

我有一个可以运行很长时间的脚本。它生成一个输出。我正在使用 child_process 从 nodejs 运行此脚本。如何在脚本开始执行后立即发送它的输出,而不是等待脚本完成。我目前拥有的代码等待脚本完成,然后在 nodejs 控制台上一次输出所有标准输出。

示例脚本:

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

一口气。无论如何我可以实现立即发送标准输出,直到子进程停止?

【问题讨论】:

  • 在这里遇到缓冲问题。
  • python 输出是否提供?在每个print 之后尝试flashimport syssys.stdout.flush()
  • 缓冲的不是 Python 输出(是的,您可以刷新它),但操作系统也会缓冲输出!阅读:turnkeylinux.org/blog/unix-buffering
  • 我知道这就是节点的 spawn 和 exec 之间的区别。产卵

标签: javascript python angularjs node.js


【解决方案1】:

简短的回答是:

您需要在非缓冲模式下重新打开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。它总是等待脚本完成,然后发送整个块。我怎样才能做到实时?
  • 而您希望这个解决方案在什么服务器技术中使用什么框架? (这可能最好作为一个单独的问题提出!
猜你喜欢
  • 2015-02-19
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2021-07-14
  • 2019-05-22
  • 2016-11-14
相关资源
最近更新 更多