gpt4 book ai didi

python - Subprocess.Popen Stdout 等待程序完成

转载 作者:太空宇宙 更新时间:2023-11-03 22:03:58 26 4
gpt4 key购买 nike

我正在通过 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 程序时,延迟功能按预期运行,并且在 Done Running 之前 5 秒打印 Running。 Node程序如下:

const delay = require("delay")
async function run(){
console.log("Running")
await delay(5000)
console.log("Done running")
}
run()

当我使用 os.system 调用 signaler.py 时不会出现此问题,而当我运行 shell=False 并修改参数时仍然会出现此问题。你知道是什么原因造成的吗?

最佳答案

听起来 python 正在缓冲 print 函数的输出,而 javascript 则没有。您可以通过在signaler.py

中使用flush关键字调用来强制将打印语句刷新到stdout
print("Running", flush=True)

关于python - Subprocess.Popen Stdout 等待程序完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59570510/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com