处理子流程的标准输入和标准输出



我想编写一个Python脚本,该脚本创建一个子进程,从stdout读取并写入stdin。写入 stdin 的内容应取决于从 stdout 读取的内容。

我已经尝试了几乎所有我能找到的关于子流程的东西。Popen,但没有任何结果。

基本上,我想编写一个脚本,使以下c代码打印"成功":

#include <stdio.h>
#include <stlib.h>
int main()
{
int var, inp;
for (int i = 0; i < 100; i++) {
var = rand();
printf("Please type %d:n", var); //random var. is printed
scanf("%d", &inp);                //inp == var?
if (inp != var) {
printf("you failed miserablyn");
return 0;
}
}
printf("successn");
return 0;
}

我无法从标准输出读取,同时仍然保持子进程的活动。任务看起来很简单,但我找不到简单的解决方案。

我希望工作的Python代码:

from subprocess import *
def getNum(s):  # "Please type 1234567:t" -> "1234567"
return "".join([t for t in s if t.isdigit()])
p = Popen("./io", stdin=PIPE, stdout=PIPE) #io is the binary obtained from above c code
for i in range(100):
out = p.stdout.readline() #script deadlocks here
print( out )
inp = getNum(out)+"n"#convert out into desired inp
p.stdin.write(inp)
print (p.communicate()[0]) #kill p and get last output

这种方法可能有点幼稚,但我也不明白为什么它不起作用。

python程序陷入等待从stdout接收某些东西。这可能是由于stdout缓冲造成的。可能有几种方法可以更改此行为,但测试此行为的一种快速方法是更改 C 可执行文件以在打印出随机生成的数字后立即强制fflush。C 代码如下所示:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int var, inp;
for (int i = 0; i < 100; i++) {
var = rand();
printf("Please type %d:n", var); //random var. is printed
// ADDED EXPLICIT stdout flush
fflush(stdout);
scanf("%d", &inp);                //inp == var?
if (inp != var) {
printf("you failed miserablyn");
return 0;
}
}
printf("successn");
return 0;
}

通过这种更改,原始的python脚本能够驱动整个交互。

最新更新