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?
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. –
@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
Ten sam problem tutaj kolego. spawp grep nigdy nie wychodzi. – kilianc