Nodo que invoca un script de Python: orden de ejecución extraño
Probé un guión bastante simple.
import time
print("Hello World")
time.sleep(5)
Este programa hace exactamente lo que parece estar haciendo. Imprime Hello World, espera cinco segundos y luego sale.
Sin embargo, las cosas comienzan a ponerse raras cuando invoco esto con 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}`);
});
Lo que sucede ahora es que el programa espera cinco segundos, luego imprime Hello Worldy luego sale inmediatamente después de la impresión. Es como si el orden de los dos comandos se invirtiera, primero ejecuta el sleep()y el print().
¿Alguien tiene alguna idea de por qué ocurre este comportamiento extraño?
Respuestas
Python almacena la salida en búfer, por lo que no la verá hasta que finalice el proceso. Puede usar la -uopción para decirle a Python que no haga eso. De los documentos , la -uopción será:
Obligue a que las secuencias stdout y stderr no tengan búfer. Esta opción no tiene ningún efecto en la secuencia stdin.
Modificado en la versión 3.7: la capa de texto de las secuencias stdout y stderr ahora no tiene búfer.
Sin embargo, estoy ejecutando 3.7.2 en Windows 10 y no podría hacer que su código funcione sin la -uopción.
const process = spawn ('py', ['-u', 'testIn.py']);