[英]Subprocess.Popen Stdout Waiting for Program Finish
我正在通过subprocess.Popen
运行一个程序并遇到一个意想不到的问题,其中stdout
没有实时打印,而是等待程序完成。 奇怪的是,这只发生在被调用的程序是用 Python 编写的。
我的控制程序(使用子进程的那个)如下:
import subprocess
import os
print("Warming up")
pop = subprocess.Popen("python3 signaler.py", shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
for line in pop.stdout:
print(line)
print("I'm done")
信号器.py:
import time
print("Running")
time.sleep(5)
print("Done running")
当我运行控制程序时,输出如下。 尽管print("Running")
发生在实际延迟之前,但代码在打印Running
之前会等待 5 秒。
Warming up
*waits 5 seconds*
b'Running\n'
b'123\n'
I'm done
奇怪的是,当我修改控制程序以运行 Node 程序时,延迟功能按预期Running
,并且Running
在Done Running
之前打印 5 秒。 Node程序如下:
const delay = require("delay")
async function run(){
console.log("Running")
await delay(5000)
console.log("Done running")
}
run()
当我使用os.system
调用os.system
时不会发生此问题,并且在我运行shell=False
并像这样修改参数时仍然会发生此问题。 任何想法是什么原因造成的?
听起来 python 正在缓冲print
函数的输出,而 javascript 不是。 您可以通过在signaler.py
使用 flush 关键字调用它来强制将打印语句刷新到标准输出
print("Running", flush=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.