Nút gọi một tập lệnh python - Thứ tự thực thi kỳ lạ
Tôi đã thử một kịch bản khá đơn giản.
import time
print("Hello World")
time.sleep(5)
Chương trình này thực hiện chính xác những gì nó dường như đang làm. Nó in ra Hello World, đợi trong năm giây và sau đó thoát ra.
Tuy nhiên, mọi thứ bắt đầu trở nên kỳ lạ khi tôi gọi điều này với nút.
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}`);
});
Điều xảy ra bây giờ là chương trình đợi trong năm giây, sau đó in Hello Worldvà sau đó thoát ngay sau khi in. Nó giống như thứ tự của hai lệnh được đảo ngược, đầu tiên nó chạy lệnh sleep()và print().
Có ai có manh mối về lý do tại sao hành vi kỳ lạ này xảy ra không?
Trả lời
Python đang đệm đầu ra nên bạn sẽ không thấy nó cho đến khi quá trình kết thúc. Bạn có thể sử dụng -utùy chọn để yêu cầu Python không làm điều đó. Từ các tài liệu , -utùy chọn sẽ:
Buộc bỏ bộ đệm các luồng stdout và stderr. Tùy chọn này không ảnh hưởng đến luồng stdin.
Đã thay đổi trong phiên bản 3.7: Lớp văn bản của các luồng stdout và stderr bây giờ không có bộ đệm.
Tuy nhiên, tôi đang chạy 3.7.2 trên Windows 10 và không thể làm cho mã của bạn hoạt động nếu không có -utùy chọn.
const process = spawn ('py', ['-u', 'testIn.py']);