2013-06-17 4 views
9

ich ein Kind Prozess wie dieses laichen:Kraft Node.js zu schreibt Kind zu spülen verarbeitet

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

ich auch einige Datenverarbeitung festgelegt:

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(); 
}); 

Mein Python-Skript liest Zeilen aus stdin und für jede Zeile führt einige Operationen und Drucke zu stdout. Es funktioniert gut in der Schale (ich eine Zeile schreiben und ich bekomme die Ausgabe sofort), aber wenn ich dies tun in Knoten:

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

ich nichts.

Ich habe es beheben proc.stdin.end() Aufruf, aber das beendet auch den untergeordneten Prozess (die ich im Hintergrund bleiben möchte, Streaming-Daten).

Ich löste auch einen Flush füllt den Puffer mit vielen Schreiben, aber das ist nicht wirklich eine Option.

Gibt es eine Möglichkeit, den Stream manuell zu leeren?

+0

Wenn 'write()' true zurückgibt, dann hat es gespült worden. Wenn sie false zurückgibt, können Sie auf das Ereignis "drain" warten, um zu überprüfen, wann der Schreibpuffer vollständig geleert wurde. Sie sagen, Sie können Daten schreiben, und es wird überhaupt nicht gespült? Ich würde vermuten, dass der Child-Prozess die Daten chunkiert und nach etwas anderem sucht als '\ n', um die Eingabe zu unterbrechen. Wenn Sie den Eingabepuffer überlaufen oder den Stream beenden, wird das Kind gezwungen, die Daten zu diesem Zeitpunkt zu verarbeiten. –

+0

@BretCopeland yup, 'write()' gibt 'true' zurück. Ich dachte, vielleicht war es nicht der Schreibvorgang, der in die Warteschlange gestellt wurde ... aber vielleicht das Lesen? Es ist komisch, aber ich bin sicher, dass die Kinder die Daten nicht chunken, da es in der Shell funktioniert, und ich kann bestätigen, dass es nach '\ n' sucht. Das Ausführen des Skripts und das einfache Schreiben von Zeilen und Drücken der Eingabetaste funktioniert wie erwartet (Daten werden in stdout geschrieben, wenn enter gedrückt wird und der Prozess nicht beendet wird). Ich bin hier wirklich festgefahren. – kaoD

+1

Das gleiche Problem hier Kumpel. Spawned Grep wird nie ausgegeben. – kilianc

Antwort

2

Die Ausgabe von Python wird nach der print-Anweisung nicht gelöscht. Ich hatte ähnliches Problem und @Alfe beantwortete meine Frage. Werfen Sie einen Blick auf diese:

Stream child process output in flowing mode

+0

Leider habe ich den Code verworfen, so kann ich nicht überprüfen, ob es das Problem löst. Danke für die Antwort! – kaoD