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

Python子进程&;标准输出-程序死锁,python,process,stdout,stdin,Python,Process,Stdout,Stdin,我有一个模拟程序,它通过标准输入法进行试验,并向标准输出 使用C++/Qt程序在QProcess中运行它效果很好 在linux下运行Python程序运行良好,使用: p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE) 并使用p.stdin.write,p.stdout.readline和p.wait 但是,在windows下,程序按其应有的方式运行并通过stdin获取命令(这已通过调试子进程进行验证),但

我有一个模拟程序,它通过标准输入法进行试验,并向标准输出

使用C++/Qt程序在QProcess中运行它效果很好

linux下运行Python程序运行良好,使用:

p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
并使用
p.stdin.write
p.stdout.readline
p.wait

但是,在windows下,程序按其应有的方式运行并通过stdin获取命令(这已通过调试子进程进行验证),但python程序在任何
p.stdout.readline
p.wait
处都会死锁。如果删除了
stdout=subprocess.PIPE
参数,则程序工作,输出显示在控制台上,不会发生死锁

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

警告:使用stdout=PIPE和/或stderr=PIPE时会死锁,并且子进程会向管道生成足够的输出 这样它就阻止了等待OS管道缓冲区接受更多数据 数据。使用communicate()可以避免这种情况

但是,我不能使用communicate(),因为程序协议不是一个命令和一个输出,而是需要几个命令和回复


有什么解决办法吗?

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

换言之,如果一个程序需要使用以前的输出来知道应该用管道输入什么,则不可能驱动该程序,除非该程序经过专门定制,在读取任何内容之前始终刷新其输出。它在真正的终端(tty或pty)上工作,因为在同一设备上进行任何读取之前,驱动程序会自动强制刷新输出


但这与您在问题中引用的文档中描述的解除锁定不同。

您是否尝试过使用
bufsize
增加缓冲区?也许会有帮助