gpt4 book ai didi

python - 如果 stdout=PIPE,我如何找出 subprocess.Popen wait() 永远等待的原因?

转载 作者:行者123 更新时间:2023-11-29 13:41:51 25 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 docswait 上确实非常清楚:

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,让子进程写入一个临时文件,然后你可以等待并在文件准备好时读取它 - - 写入文件而不是管道,不会有死锁的风险。

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

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