gpt4 book ai didi

python - 如果stdout = PIPE,我如何找出为什么subprocess.Popen wait() 永远等待?

转载 作者:IT老高 更新时间:2023-10-28 20:44:11 29 4
gpt4 key购买 nike

我有一个写入标准输出和可能标准错误的程序。我想从 python 运行它,捕获标准输出和标准错误。我的代码如下:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()

对于几个程序,这可以正常工作,但是当我添加一个新程序时,新程序会永远挂起。如果我删除 stdout=PIPE,程序会将其输出写入控制台并完成,一切都很好。如何确定导致挂起的原因?

在 Windows XP 上使用 python 2.5。该程序不会从标准输入读取数据,也没有任何类型的用户输入(即“按下键”)。

最佳答案

当管道的缓冲区填满时(通常为 4KB 左右),写入过程将停止,直到读取过程读取了一些有问题的数据;但是在这里,在子进程完成之前,您什么都没有读取,因此出现了死锁。 The docs关于wait确实说得很清楚:

Warning This will deadlock if the child process generates enough output to a stdout or stderr pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

如果由于某种原因您不能使用 communicate,请让子进程写入一个临时文件,然后您可以 wait 并在该文件准备好时读取该文件 - - 写入文件而不是管道,不会有死锁的风险。

关于python - 如果stdout = PIPE,我如何找出为什么subprocess.Popen wait() 永远等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445627/

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