【发布时间】:2018-03-08 22:25:28
【问题描述】:
我有一个模拟程序,它通过标准输入进行试验并提供输出到标准输出
在 QProcess 中运行 C++/Qt 程序效果很好。
在 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 时出现死锁,并且子进程会向管道生成足够的输出 这样它会阻止等待操作系统管道缓冲区接受更多 数据。使用communicate() 来避免这种情况。
但是,我不能使用communicate(),因为程序协议不是一个命令和一个输出,而是需要几个命令和回复。
有什么解决办法吗?
【问题讨论】:
-
您是否尝试过使用
bufsize增加缓冲区?它可能会有所帮助
标签: python process stdout stdin