2014-10-12 80 views
0

我試圖使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讀回時,它成爲兩個或更多個塊有時。這不是我想要的。

我該如何解決這個問題?

回答

0

當你產卵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