Python子进程和标准输出

我有一个模拟程序,通过stdin进行引导,并提供输出到标准输出

在QProcess中运行C ++ / Qt程序运行良好。

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

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

并使用p.stdin.writep.stdout.readlinep.wait

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

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

警告 :当使用stdout = PIPE和/或stderr = PIPE时,这会发生死锁,并且子进程向管道生成足够的输出,从而阻止等待OS管道缓冲区接受更多数据。 使用通信()来避免这种情况。

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

有没有解决方法?


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

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

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

链接地址: http://www.djcxy.com/p/77125.html

上一篇: Python subprocess & stdout

下一篇: When should I use `wait` instead of `communicate` in subprocess?