subprocess.communicate()向进程发送垃圾?

时间:2012-02-22 19:33:25

标签: python subprocess

我在使用subprocess.communicate()在子进程中读/写stdin / stdout时遇到问题。

这是子进程(在C中)

#include <stdio.h>

int main ()
{
    char buf[128];
    printf("test\n");
    gets(buf);
    printf("%s", buf);
    return 0;
}

这是python中调用该子程序的程序

import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

stdin, stderr = proc.communicate()
print stdin
proc.communicate(stdin)
stdin, stderr = proc.communicate()
print stdin

print stdin

我希望这会打印

test
input was test:

但是,似乎proc.communicate()导致gets()的EOF,导致子应用程序终止。无论如何我可以在不发送EOF的情况下与子应用程序通信吗? IE我想阅读应用程序,然后写信给它。

1 个答案:

答案 0 :(得分:1)

来自Popen.communicate()的文档:

  

将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。等待进程终止。

这意味着您只能为子流程调用communicate()一次。

获取实时输出可能有点棘手,但在您的示例中,它不应该太难,因为您只是尝试读取一行。以下应该有效:

import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

outdata = proc.stdout.readline()
print outdata
outdata, errdata = proc.communicate('output was ' + outdata)
print outdata

请注意,我重命名了一些变量,因为子进程的输出对于Python进程来说并不是真正的stdin。