首页 文章

Python subprocess&stdout - 程序死锁

提问于
浏览
2

我有一个模拟程序,它通过stdin引导并向stdout提供输出

在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管道缓冲区接受更多数据 . 使用communic()来避免这种情况 .

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

有什么解决方案吗?

1 回答

  • 1

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

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

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

相关问题