Nó que invoca um script Python - Ordem de execução estranha

Sep 08 2020

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

2 JohnnyMopp Sep 09 2020 at 21:10

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']);