我在使用 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 我想读取应用程序然后写入它。
最佳答案
来自 Popen.communicate()
的文档:
Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate.
这意味着您只能为子进程调用一次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 进程的标准输入。
关于python - subprocess.communicate() 向进程发送垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9401671/