Nó que invoca um script Python - Ordem de execução estranha
Tentei um script bastante simples.
import time
print("Hello World")
time.sleep(5)
Este programa faz exatamente o que parece estar fazendo. Ele imprime Hello World, espera cinco segundos e depois sai.
No entanto, as coisas começaram a ficar estranhas quando invoquei isso com o 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}`);
});
O que acontece agora é que o programa espera cinco segundos, imprime Hello Worlde sai imediatamente após a impressão. É como se a ordem dos dois comandos fosse invertida, primeiro ele executa o sleep()e o print().
Alguém tem ideia de por que esse comportamento estranho ocorre?
Respostas
Python está armazenando a saída em buffer, para que você não a veja até que o processo termine. Você pode usar a -uopção de dizer ao Python para não fazer isso. Nos documentos , a -uopção irá:
Força os streams stdout e stderr a serem sem buffer. Esta opção não tem efeito no fluxo stdin.
Alterado na versão 3.7: A camada de texto dos streams stdout e stderr agora está sem buffer.
No entanto, estou executando 3.7.2 no Windows 10 e não consegui fazer seu código funcionar sem a -uopção.
const process = spawn ('py', ['-u', 'testIn.py']);