我在使用subprocess.communicate()的子进程中读/写标准输入/标准输出时遇到了问题。
这是子进程(在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的情况下与子应用程序通信?也就是说,我想先读取应用程序,然后再写入。
发布于 2012-02-23 03:44:00
来自Popen.communicate()的文档
将数据发送到标准输入。从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。
https://stackoverflow.com/questions/9401671
复制相似问题