2013-06-17 24 views
9

I tarło proces potomny takiego:siły node.js do spłukiwania pisze na dziecko przetwarza

var child = require('child_process'); 
var proc = child.spawn('python', ['my_script.py', '-p', 'example']); 

ja też ustalić pewne obsługę danych:

proc.stdin.setEncoding('utf8'); 
proc.stdout.setEncoding('utf8'); 
proc.stderr.setEncoding('utf8'); 

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

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

proc.on('close', function (code) { 
    console.log('subprocess exited with status ' + code); 
    proc.stdin.end(); 
}); 

My Python skrypt czyta linie z stdin i dla każdej linii wykonuje niektóre operacje i drukuje do stdout. To działa dobrze w powłoce (piszę wiersz i uzyskać wyjście natychmiast), ale kiedy to zrobić w węźle:

for (var i = 0; i < 10; i++) { 
    proc.stdin.write('THIS IS A TEST\n'); 
} 

mam nic.

Muszę to naprawić, wywołując proc.stdin.end(), ale to również kończy proces potomny (który chcę pozostać w tle, dane strumieniowe).

Wywołałem także opróżnianie bufora z wieloma zapisami, ale to nie jest opcja.

Czy istnieje sposób na ręczne przepłukanie strumienia?

+0

Jeśli 'write()' zwraca true, a następnie została ona zaczerwieniona. Jeśli zwróci false, możesz nasłuchiwać zdarzenia "drenażu", aby sprawdzić, czy bufor zapisu został całkowicie przepłukany. Mówisz, że możesz pisać dane i nigdy się w ogóle nie zaczerwienisz? Podejrzewam, że proces potomny tupie dane i szuka czegoś innego niż '\ n', aby rozbić dane wejściowe. Po przepełnieniu bufora wejściowego lub zakończeniu strumienia dziecko jest zmuszane do przetwarzania danych w tym czasie. –

+0

@BretCopeland yup, 'write()' zwraca 'true'. Pomyślałem, że może to nie pismo czeka w kolejce ... ale może czytasz? To dziwne, ale jestem pewien, że dzieci nie dzielą danych, ponieważ działają w powłoce i mogę zweryfikować, czy szukają \ n. Uruchomienie skryptu i po prostu wpisanie linii i naciśnięcie enter działa zgodnie z oczekiwaniami (dane zapisywane są na standardowe wyjście po naciśnięciu klawisza Enter, a proces nie kończy się). Naprawdę utknąłem tutaj. – kaoD

+1

Ten sam problem tutaj kolego. spawp grep nigdy nie wychodzi. – kilianc

Odpowiedz

2

Nie wypróżniasz wyjścia z Pythona po instrukcji print. Miałem podobny problem i @Alfe odpowiedział na moje pytanie. Spójrz na to:

Stream child process output in flowing mode

+0

Niestety odrzuciłem kod, więc nie mogę sprawdzić, czy rozwiązuje problem. Dziękuję za odpowiedź! – kaoD