Nœud invoquant un script python - Ordre d'exécution étrange
J'ai essayé un script assez simple.
import time
print("Hello World")
time.sleep(5)
Ce programme fait exactement ce qu'il semble faire. Il imprime Hello World, attend cinq secondes puis sort.
Cependant, les choses commencent à devenir bizarres lorsque j'invoque cela avec node.
const spawn = require('child_process').spawn;
const process = spawn ('python3', ['./testIn.py']);
process.stdout.on('data', data => {
console.log(data.toString());
});
process.on('close', code => {
console.log(`child process close all stdio with code ${code}`);
});
Ce qui se passe maintenant, c'est que le programme attend cinq secondes, puis imprime Hello Worldet se termine immédiatement après l'impression. C'est comme si l'ordre des deux commandes était inversé, d'abord il exécute le sleep()et le print().
Quelqu'un at-il une idée de la raison pour laquelle ce comportement étrange se produit?
Réponses
Python met en mémoire tampon la sortie afin que vous ne la voyiez pas avant la fin du processus. Vous pouvez utiliser l' -uoption pour dire à Python de ne pas faire cela. À partir de la documentation , l' -uoption:
Forcer les flux stdout et stderr à ne pas être tamponnés. Cette option n'a aucun effet sur le flux stdin.
Modifié dans la version 3.7: La couche de texte des flux stdout et stderr est désormais sans tampon.
Cependant, j'exécute 3.7.2 sur Windows 10 et je ne pourrais pas faire fonctionner votre code sans l' -uoption.
const process = spawn ('py', ['-u', 'testIn.py']);