一尘不染

流模式下的流子进程输出

node.js

我有使用Python编写的自定义命令行,该命令行使用“ print”语句打印其输出。我通过生成一个子进程并使用 child.stdin.write
方法向其发送命令来从Node.js使用它。来源:

var childProcess = require('child_process'),
    spawn = childProcess.spawn;

var child = spawn('./custom_cli', ['argument_1', 'argument_2']);

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

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

//execute first command after 1sec
setTimeout(function () {
  child.stdin.write('some_command' + '\n');
}, 1000);

//execute "quit" command after 2sec
//to terminate the command line
setTimeout(function () {
  child.stdin.write('quit' + '\n');
}, 2000);

现在的问题是我没有以流动模式接收输出。我希望在打印子进程后立即获得它的输出,但是仅当子进程终止时(使用自定义cli的
quit 命令),我才接收所有命令的输出。


阅读 209

收藏
2020-07-07

共1个答案

一尘不染

您需要在子进程中刷新输出。

可能您认为这不是必需的,因为在终端上进行测试并让输出发生时,库会自行刷新(例如,当一行完成时)。当打印到管道上时(由于性能原因),不会执行此操作。

冲洗自己:

#!/usr/bin/env python

import sys, time

while True:
  print "foo"
  sys.stdout.flush()
  time.sleep(2)
2020-07-07