2014-10-12 4 views
0

R과 nodej가 서로 통신하도록 노력하지만 몇 가지 문제가 있습니다. 내가 자식 프로세스에 명령을 보내모듈 child_process로 Nodejs에서 하나의 Input One Output을 실현하는 방법

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'이벤트를 첨부하면 스트림이 '플로팅 모드'로 이동합니다. 즉, 사용 가능한 즉시 데이터를 반환합니다. 많은 양의 데이터가 있으면 한 번에 하나의 청크를 반환합니다. 그 문제를 해결하는 몇 가지 방법이있다

:

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

을 또는, 당신은 할 수 있습니다

당신은 모든 청크를 버퍼 수

및 출력 할 것은 'end'이벤트는 다음과 같은 발사 때 데이터 이벤트 리스너를 모두 제거하고 stdout.read()으로 호출하십시오.

stdout.read()는 언제든지 스트림의 모든 내용을 읽으므로 프로세스가 더 이상 아무것도 출력하지 않을 때 stdout.read()를 호출해야합니다.

+0

나는 코드를 시험해 보았다. 그것은 내가 원한 것이 아니었다. 어쩌면 충분히 명확하지 않을 수도 있습니다. R에 하나의 명령을 보내면이 명령의 출력을 얻습니다.이 출력이 데이터 수신기 때문에 Nodejs에서 두 청크로 다시 읽힌다 고 가정 해 봅시다. nodejs가 다시 읽었을 때, 하나의 chunk가 될 때, 나는이 chuck 출력을 처리하기위한 코드를 작성하기 위해 무엇을 할 수 있는가? 그런 다음 다른 명령을 보내고 또 하나의 덩어리를 얻습니다. 당신의 방식대로, 출력은 하나의 버퍼링되고, 나는 명령에 따라 출력을 분리하기 위해 여분의 코드를 작성해야합니다. 이것은 가능하고 실용적이지 않습니다. –

+0

출력 크기를 알면 스트림의 버퍼 크기를 늘릴 수 있지만 한 명령 만 보내는 경우 내 코드는 명령의 전체 결과를 출력합니다. 당신이 원하는게 뭔지 모르겠군요 ... – xShirase

관련 문제