如何通过模块child_process实现NodeJ中的一个输入一个输出

问题描述:

我试图使R和nodej相互通信,但我遇到了一些问题。我将与此块的代码如何通过模块child_process实现NodeJ中的一个输入一个输出

var cp = require('child_process') 
var spawn = cp.spawn 

var r = spawn("rterm",["--ess" ,"--slave"]) 

r.stdout.on('data',function(data){ 
    console.log(data.toString()) 
    }) 

我发送一个命令给子过程的详细解释,子进程随后产生大量的输出(在合理的长度内),则输出是自动的NodeJS读回因为'数据'倾听者。

但是对于子进程,输出是一个块,然后当由Nodejs读回时,它成为两个或更多个块有时。这不是我想要的。

我该如何解决这个问题?

当你产卵child process时,stdout是Readable Stream。当您附加'data'事件时,流将进入'流动模式',这意味着它会在数据可用时立即返回。当你有很多数据时,它会一次返回一个数据块。

有一对夫妇的方式来解决这个问题:

你可以缓冲所有块,并把它们输出的时候,“end”事件被激发,象下面这样:

var output=""; 
r.stdout.on('data',function(data){ 
    output+=data 
}).on('end',function(){ 
    console.log(output); 
}); 

或者,你可以完全删除数据事件侦听器并调用stdout.read()

stdout.read()会随时读取流的所有内容,因此当您的进程不再输出任何内容时必须调用它。

+0

我试过了代码,那不是我既不想要的。也许我还不够清楚。我发送一个命令给R,我得到这个命令的输出,假设这个输出由于数据监听器而由Nodejs以两个块读回。我可以做什么,以便当nodejs回读时,它是一个块,我编写代码来处理这个输出的查找。然后我发送另一个命令,我又得到另一个命令,我也这样做。在你的方式,输出缓冲到一个,然后我必须编写额外的代码来根据命令分开输出,这是不可能和实际的。 – 2014-10-13 10:29:33

+0

如果知道输出的大小,可以增加流的缓冲区大小,但是如果只发送一个命令,我的代码将输出命令的完整结果。不知道你想要什么... – xShirase 2014-10-13 10:32:35