2014-12-13 7 views
11

node.js에서 대화 형 쉘 명령을 실행해야합니다.node.js에서 대화 형 셸 명령을 실행하는 방법은 무엇입니까?

var cp = require('child_process'); 
var pythonChildProcess = cp.spawn('python'); 

pythonChildProcess.stdout.on("data", function(data) { 
    console.log('data successfully written!', data); // never outputs anything 
}); 

pythonChildProcess.stdin.write('1 + 1'); 
pythonChildProcess.stdin.end(); 

이 코드는 아무것도 출력하지 않습니다 (그러나 표준 출력은 2해야한다) : 대화 형 쉘 $ python 될 수 있습니다.

그러나 만약 그렇다면, 또 다른 문제가 있습니다. 대화 형으로 만드는 방법은 무엇입니까? 전화가 pythonChildProcess.stdin.end(); 일 때 과정이 끝납니다! 하지만 난 그냥 stdin 끝내고 다음 표준 쓰기 싶었어요!

UPD : enter 버튼을 에뮬레이션 할 수 있다면 대화식으로 프로세스에 쓸 수 있습니다. 그러나 입력 문자열의 끝에 \n을 추가해도 도움이되지 않습니다.

+0

? 이게 무슨 뜻인지 설명해 주시겠습니까? –

+0

@ E_net4, 나는'$ python' 명령을 실행하고, 어떤 입력 (예를 들어'1 + 1')을 작성하고,'enter'를 누르고, 약간의 출력 ('2')을 얻고 싶습니다. 다른 입력 ('10 + 10'),''enter''를 다시 한 번 눌러서 다른 출력을 얻은 다음 다른 입력을 작성하십시오. 그리고 ... "입력"과 같은 시퀀스는 "stdins"라고합니다. –

+0

실제로는 여러 개의 입력 행을 보내려는 단일 표준 스트림. –

답변

4

노드가 다른 대화 형 쉘과 인터페이싱하지 못하게하는 것 중 하나는 자식 응용 프로그램이 stdin이 터미널처럼 보이지 않는 경우에도 "대화식"동작을 유지해야한다는 것입니다. 여기 pythonstdin이 터미널이 아니므로 작동하지 않습니다. 이것은 파이썬 명령에 -i 플래그를 추가하여 무시할 수 있습니다.

둘째, 업데이트에서 언급했듯이 스트림에 줄 바꿈 문자를 쓰는 것을 잊었 기 때문에 프로그램이 사용자가 Enter 키를 누르지 않은 것처럼 동작합니다. 예, 정상적으로 진행되지만 대화 형 모드가 없기 때문에 결과를 검색 할 수 없습니다.

대화 형 셸로 여러 입력을 보내고 각 결과를 하나씩 검색 할 수있는 방법이 있습니다. 이 코드는 긴 출력에 강하고 다른 명령을 수행하기 전에 전체 라인을 수신 할 때까지 누적됩니다. 한 번에 여러 명령어를 수행 할 수 있으므로 상위 프로세스의 상태에 의존하지 않는 것이 좋습니다. 목표를 달성하기 위해 다른 비동기 구조를 자유롭게 실험 해보십시오.

var cp = require('child_process'); 
var childProcess = cp.spawn('python', ['-i']); 

childProcess.stdout.setEncoding('utf8') 

var k = 0; 
var data_line = ''; 

childProcess.stdout.on("data", function(data) { 
    data_line += data; 
    if (data_line[data_line.length-1] == '\n') { 
    // we've got new data (assuming each individual output ends with '\n') 
    var res = parseFloat(data_line); 
    data_line = ''; // reset the line of data 

    console.log('Result #', k, ': ', res); 

    k++; 
    // do something else now 
    if (k < 5) { 
     // double the previous result 
     childProcess.stdin.write('2 * + ' + res + '\n'); 
    } else { 
     // that's enough 
     childProcess.stdin.end(); 
    } 
    } 
}); 


childProcess.stdin.write('1 + 0\n'); 
3

코드를 읽는 것만으로도 이해할 수있는 사용자를 위해 @E_net4의 답변 버전입니다. 자세한 설명은 그의 대답을 읽어주십시오. 그는 그것을 잘 묘사했습니다.

var spawn = require('child_process').spawn 

var p = spawn('node',['-i']); 

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

p.stdin.write('1 + 0\n'); 

출력 : "최종 표준 입력 및 다음 표준 입력을 쓰기"

> 
1 
관련 문제