Exec : afficher stdout “live”
J'ai ce script simple :
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
où j'ai simplement exécuter une commande pour compiler un café-fichier de script. Mais stdout jamais affiché dans la console, parce que la commande ne se termine jamais (à cause de l'option-w de café).
Si j'exécute la commande directement à partir de la console j'obtiens un message comme ceci :
18:05:59 - compiled my_file.coffee
Ma question est : est il possible d'afficher ces messages avec l'node.js exec ? Si oui, comment ? !
Grâce
- Je suis venu ici à la recherche pour la capture de la sortie standard de Python exécutable. Notez que tous les ci-dessous, mais vous avez besoin pour exécuter python avec un "u" option, pour faire outout des barrettes de mémoire et d'avoir ainsi mises à jour en direct.
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser
exec
. Utilisationspawn
qui est unEventEmmiter
objet. Ensuite, vous pouvez écouter de lastdout
/stderr
événements (spawn.stdout.on('data',callback..)
) comme ils se produisent.De NodeJS documentation:
exec
tampons de sortie et retourne généralement lorsque la commande a fini de s'exécuter.flush(stdout);
en C) afin de déclencher des événements dans Node.js.process.exit()
.process.stdout.write( data.toString() );
empêche d'ajouter un saut de ligne (comme la console.journal ne) après chaque sortie standard (stdout) de l'émission.var spawn = require('child_process').spawn, git = spawn('git', ['clone', 'https://github.com/MaxySpark/Text-Clustering.git']); git.stdout.on('data', function (data) { console.log('stdout: ' + data.toString()); }); git.stderr.on('data', function (data) { console.log('stderr: ' + data.toString()); }); git.on('exit', function (code) { console.log('child process exited with code ' + code.toString()); });
sa seule impressionstderr: Cloning into 'Text-Clustering'...
pourquoi ne pas imprimer les autres sorties de textes? et pourquoi est-il surstderr
?exec
reviendra également un ChildProcess objet qui est un EventEmitter.OU
pipe
le processus enfant stdout pour les principaux stdout.OU d'hériter de stdio à l'aide de spawn
pipe
:coffeeProcess.stdout.pipe(process.stdout);
spawn(cmd, argv, { stdio: 'inherit' })
. Voir nodejs.org/api/child_process.html#child_process_options_stdio pour les différents exemples.spawn
avecstdio: 'inherit'
. Il produit une sortie plus précise queexec
et de la tuyauteriestdout
/stderr
, par exemple lors de l'affichage de la progression de l'information à partir d'ungit clone
.Il y a déjà plusieurs réponses cependant, aucun d'entre eux parler de la meilleure (et la plus simple) pour ce faire, ce qui est à l'aide de
spawn
et la{ stdio: 'inherit' }
. Il semble produire les résultats les plus précis, par exemple lors de l'affichage de la progression de l'information à partir d'ungit clone
.Simplement faire ceci:
De crédit à @MorganTouvereyQuilling de souligner ce point dans ce commentaire.
stdio: "inherit"
conserve que le formatage de toutchild.stdout.pipe(process.stdout)
ne le fait pas.Je voudrais juste ajouter qu'un petit problème avec la sortie de la mémoire tampon des chaînes à partir d'un processus générés dynamiquement avec
console.log()
est qu'il ajoute des sauts de ligne, qui peut se propager de votre engendré processus de production au-dessus des lignes supplémentaires. Si vous sortiestdout
oustderr
avecprocess.stdout.write()
au lieu deconsole.log()
, vous obtiendrez alors la sortie de la console à partir du donné naissance à un processus "comme est".J'ai vu que la solution ici:
Node.js: impression à la console sans une fuite de saut de ligne?
Espère que ça aide quelqu'un à l'aide de la solution ci-dessus (qui est un grand pour vivre de sortie, même si c'est à partir de la documentation).
spawn(command, args, { stdio: 'inherit' })
, comme suggéré par @MorganTouvereyQuilling ici stackoverflow.com/questions/10232192/...Inspiré par Nathanaël Smith réponse et Eric Freese commentaire, il pourrait être aussi simple que:
ls
, mais échoue pour des commandes plus complexes tels quenpm install
. J'ai même essayé de la tuyauterie à la fois la sortie standard stdout et stderr de leur processus respectif des objets.spawn(command, args, { stdio: 'inherit' })
, comme suggéré ici stackoverflow.com/questions/10232192/...J'ai trouvé utile d'ajouter un exec script pour mes utilitaires qui font cela.
utilities.js
app.js
Après avoir examiné toutes les autres réponses, j'ai fini avec cela:
Parfois
data
aura plusieurs lignes, de sorte que leoldSchoolMakeBuild
en-tête apparaît une seule fois pour plusieurs lignes. Mais cela ne me dérange pas suffisant pour changer.child_process.frayer retourne un objet avec stdout et stderr ruisseaux.
Vous pouvez appuyer sur la sortie standard (stdout) flux de lire les données que le processus de l'enfant envoie vers le Nœud. stdout cours d'un ruisseau a l' "données", "fin", et d'autres événements courants. spawn est préférable de l'utiliser quand vous voulez le processus de l'enfant de retourner une grande quantité de données à un Nœud - traitement de l'image, la lecture des données binaires, etc.
de sorte que vous pouvez résoudre votre problème à l'aide de child_process.frayer utilisés ci-dessous.