Python子进程及标准输出——程序死锁

2024-06-09 11:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在Q进程中运行一个强> EM>C++ +QT<强>程序,运行良好。在

编写一个Python程序,在linux下运行,使用:

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

并使用p.stdin.writep.stdout.readline、和{}

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

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

Warning : This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

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

有什么解决办法吗?在


Tags: andtheto命令程序readlinethat进程
1条回答
网友
1楼 · 发布于 2024-06-09 11:17:44

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

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

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

相关问题 更多 >