Python的子&标准输出 - 程序死锁

Python的子&标准输出 - 程序死锁

问题描述:

我具有被先导虽然标准输入并提供输出到stdoutPython的子&标准输出 - 程序死锁

否则用于在QProcess中运行它C++/Qt的程序的模拟程序效果很好。

做一个的Python程序下Linux上运行它效果很好,使用:

p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE) 

而且使用p.stdin.writep.stdout.readline,并p.wait

然而,下windows,程序运行并通过stdin获取命令(这已通过调试子进程进行了验证),但python程序在任何p.stdout.readlinep.wait处都出现死锁。如果stdout=subprocess.PIPE参数被删除,程序将运行,输出将显示在控制台上,并且不会发生死锁。

这听起来熟悉从Python文档的警告:

警告:这将使用标准输出=管和/或标准错误= PIPE并且当死锁子进程产生足够的输出到管道 这样它就会阻止等待OS管道缓冲区接受更多的 数据。使用通信()来避免这种情况。

但是,我不能使用通信(),因为程序协议不是单个命令和单个输出,而是需要多个命令和答复。

有没有解决方法?

+0

您是否尝试过使用'bufsize'增加缓冲区?它可能有帮助 – Vinny

不确定它,但它看起来像一个缓冲的问题。在Linux上(如在大多数Unix或类Unix上),输出到文件或管道的操作系统内部进行缓冲。这意味着在调用write之后,所有数据都被缓冲,但管道的另一端没有任何数据可用,直到内部缓冲区已满,数据被刷新或管道关闭。这就是为什么pty是发明的原因之一,并且而不是用管子对实现。

换句话说,驱动一个程序,你需要使用先前的输出来知道你应该给管道输入什么,除非程序是专门为它定制的,在读取任何东西之前一直刷新它的输出。它在一个真正的终端(tty或pty)上工作,因为驱动程序会在任何读取同一设备之前自动强制刷新输出。

但它与您在问题中引用的文档中描述的不同。