Nodo che richiama uno script python - Strano ordine di esecuzione

Sep 08 2020

Ho provato uno script abbastanza semplice.

import time
print("Hello World")
time.sleep(5)

Questo programma fa esattamente quello che sembra stia facendo. Stampa Hello World, attende cinque secondi e poi esce.

Tuttavia, le cose iniziano a diventare strane quando ho invocato questo 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}`);
 });

Quello che succede ora è che il programma attende cinque secondi, quindi stampa Hello Worlde quindi esce immediatamente dopo la stampa. È come se l'ordine dei due comandi fosse invertito, prima esegue il sleep()e il print().

Qualcuno ha idea del motivo per cui si verifica questo strano comportamento?

Risposte

2 JohnnyMopp Sep 09 2020 at 21:10

Python esegue il buffering dell'output in modo da non vederlo fino al termine del processo. Puoi usare l' -uopzione per dire a Python di non farlo. Dai documenti , l' -uopzione:

Forza la non bufferizzazione dei flussi stdout e stderr. Questa opzione non ha effetto sul flusso stdin.
Modificato nella versione 3.7: il livello di testo degli stream stdout e stderr ora è senza buffer.

Tuttavia, sto eseguendo 3.7.2 su Windows 10 e non riesco a far funzionare il tuo codice senza l' -uopzione.

const process = spawn ('py', ['-u', 'testIn.py']);