我在使用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我想阅读应用程序,然后写信给它。
答案 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。