2015-01-05 9 views
9

Rückkehr Ich bin ein Yeoman Generator und mit child_process.spawn Schreiben() (über Yeoman des spawnCommand() - siehe https://github.com/yeoman/generator/blob/master/lib/actions/spawn_command.js)Knoten Kindprozess Laich stdout als null

Mein Code sieht wie folgt aus:

var list = this.spawnCommand('npm', ['list', 'sails'], {stdio: 'pipe'}); 
list.stdout.on('data', /* callback here that wants to consume the command's output */); 

Ich kann sehen, dass list.stdio existiert, und dass es [0,1,2] als Schlüssel hat. Jeder von ihnen ist null (oder undefiniert). Das heißt, Protokollierung _.keys(list).join() Ausgänge ,,. list.stdout.on() gibt mir eine Ausnahme, die besagt, dass stdout null ist.

Was ich erreichen muss, ist zu überprüfen, ob ein bestimmtes Paket installiert ist und sehen, was die Versionsnummer ist. Aber ich muss später auch andere Dinge tun, wo ich die Ausgabe von CLI-Befehlen analysiere (zum Beispiel git log output), also brauche ich eine allgemeine Lösung. .spawn() scheint wie, was ich will, aber Beispiele, die ich gesehen habe, scheinen darauf hinzuweisen, dass stdout etwas sein sollte, das eine .on() Methode hat. Zum Beispiel der hier angegebene: http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options wo es zeigt ls -lh /usr läuft.

Fehle ich etwas einfaches? Ich frage mich, ob der Befehl, den ich ausführe, überhaupt keine Ausgabe zurückgibt, wenn das bedeutet, dass stdout null ist. Wenn das der Fall ist, dann muss ich nur Befehle identifizieren, die möglicherweise keine Ausgabe haben, und einfach überprüfen, ob stdout nicht null ist, bevor ich versuche, sie zu verwenden.

bearbeiten tatsächlich, zeigt die npm Liste Befehls der Ausgabe auf der Kommandozeile, aber nach den Log-Anweisungen Ich war mit dem Problem zu diagnostizieren (was ich nach dem .spawnCommand() Aufruf und vor dem .on() Anruf setzen würde. Aber ich brauche Zugriff darauf in meinem Code - es in der Befehlszeile anzeigen zu lassen, ist neben dem Punkt (außer dass es mich wissen lässt, dass der Prozess den CLI-Befehl erfolgreich ausgeführt hat).

+0

Haben Sie jemals herausgefunden, was die Ursache war? Ich suche jetzt auch eine Antwort. – Rondo

+0

Nicht so weit :(Entschuldigung – jinglesthula

Antwort

10

Ich bin gerade in diesen - Hafen 'gelaufen Ich habe zu tief in die Details geschaut, aber ich kann dir sagen, dass die Einstellung {stdio: 'whatever'} in der Option spawn verhindert, dass der Spawn ein Objekt mit stdout und stderr Streams zurückgibt - beide werden null sein.

Wenn Sie diese Option entfernen, werden sie wieder vollwertiges Ströme sein (und ist über .on()

Von the docs you linked to, es sieht aus wie Sie die stdio zu einem bestehenden Stream einstellen -. Vielleicht ist das die Flexibilität, die Sie ‚re für?

+3

Gibt es eine Möglichkeit, '{stdio: 'erben oder was auch immer'}' und Zugriff auf die 'stdout' /' stderr' Streams des Kindes? –

+0

@KennethWorden Basierend auf meinem Verständnis der Dokumente "Pipe" ist diese Option, aber die Frage des OP zeigt an, dass es nicht funktioniert. –

0

Suche Wenn das Kind mit stdio Satz auf etwas anderes als hervorgebracht wurde‚Rohr‘, dann wird subprocess.stdoutnull sein.

Siehe

Verwandte Themen