我有一个模拟程序,通过stdin进行引导,并向stdout提供输出
在Q进程中运行一个强> EM>C++ +QT
编写一个Python程序,在linux下运行,使用:
p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
并使用p.stdin.write
、p.stdout.readline
、和{
然而,在windows下,程序运行并通过stdin获得命令(这已经通过调试子进程得到了验证),但是python程序在任何p.stdout.readline
和p.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(),因为程序协议不是一个命令和一个输出,而是需要几个命令和应答。在
有什么解决办法吗?在
不确定,但看起来像是缓冲问题。在Linux上(与大多数Unix或类似Unix的系统一样),文件或管道的输出在操作系统级别进行内部缓冲。这意味着在一个
write
调用之后,所有的数据都将被缓冲,但是在管道的另一端没有可用的数据,直到内部缓冲区已满、数据被刷新或管道关闭。这就是为什么发明了pty
s,而不是用管道对实现的原因之一。在换言之,在需要使用以前的输出来知道应该用管道作为输入的情况下,驱动一个程序是不可能的,除非该程序是专门为它量身打造的,通过在读取任何内容之前始终刷新其输出。它在一个真正的终端(tty或pty)上工作,因为在同一个设备上进行任何读取之前,驱动程序会自动强制刷新输出。在
但它与您在问题中引用的文档中描述的delock不同。在
相关问题 更多 >
编程相关推荐