Node memanggil skrip python - Perintah eksekusi aneh

Sep 08 2020

Saya mencoba skrip yang cukup sederhana.

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

Program ini melakukan persis seperti yang tampaknya dilakukannya. Ini mencetak Hello World, menunggu selama lima detik dan kemudian keluar.

Namun, hal-hal mulai menjadi aneh ketika saya memanggil ini dengan 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}`);
 });

Apa yang terjadi sekarang adalah program menunggu selama lima detik, kemudian mencetak Hello Worlddan kemudian keluar segera setelah pencetakan. Ini seperti urutan dari dua perintah yang dibalik, pertama menjalankan sleep()dan print().

Adakah yang tahu mengapa perilaku aneh ini terjadi?

Jawaban

2 JohnnyMopp Sep 09 2020 at 21:10

Python melakukan buffering pada output sehingga Anda tidak akan melihatnya sampai proses selesai. Anda dapat menggunakan -uopsi untuk memberi tahu Python agar tidak melakukan itu. Dari dokumen , -uopsinya akan:

Paksa aliran stdout dan stderr untuk dilepas. Pilihan ini tidak berpengaruh pada aliran stdin.
Berubah pada versi 3.7: Lapisan teks aliran stdout dan stderr sekarang tidak disangga.

Namun, saya menjalankan 3.7.2 di Windows 10 dan tidak dapat membuat kode Anda berfungsi tanpa -uopsi tersebut.

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