将一个运行程序的输出流输出到其他运行程序的输入流

时间:2013-11-30 06:37:10

标签: python c shell unix

我有两个并行运行的程序。 我想将一个程序的输出流重定向到其他程序的输入流。 我试过管道,但似乎第一个程序的输出仅在第一个程序的终止时被重定向到第二个程序的输入。 但是,我的要求并非如此。 例如,第一个程序是print.c,如下所示:

int main(){
        int t=1;
        while(t!=0){
                printf("%d",t);
                scanf("%d",&t);
        }   
}

第二个程序是inputP.py,如下所示:

#!/usr/bin/python     
t=1     
while t!=0:    
        f = open('outP.txt','a')    
        t = int(raw_input())    
        f.write(str(t))        
        f.close() 

我的要求是第二个程序应该在打印一个数字时读取第一个程序的输出,并且两个程序都不会终止。

我怎样才能实现这个目标?

2 个答案:

答案 0 :(得分:2)

这是因为UNIX在检测到它是管道时缓冲了stdin。真正发生的是第一个程序的输出存储在一个缓冲区中,直到它达到一定的大小或直到程序终止(以先发生者为准 - 它是一个非常大的缓冲区,所以你先达到第二个条件),一旦缓冲区被视为已满,它将作为输入发送到第二个程序。

所以看起来你希望你的第二个(Python)程序的输入只能进行行缓冲(如果你以交互方式运行程序时会发生这种情况,其stdin是tty而不是管道)。

您正在寻找的模块称为pexpect:http://pexpect.readthedocs.org/en/latest/

答案 1 :(得分:0)

你的C程序,Python程序应该被修改。

原始C程序在获得输入之前会打印1。并且它不会打印最后一个输入值(0)。以下是修改版本:

#include <stdio.h>

int main()
{
    int t = 1;
    do {
        scanf("%d", &t);
        printf("%d\n", t); /* print newline */
        fflush(stdout); /* force flush */
    } while (t != 0);
    return 0;
}

Python程序:

t = 1
f = open('outP.txt','a') # Open file once!
while t != 0:
    t = int(raw_input())
    f.write(str(t) + '\n') # print newline
    f.flush()
f.close()

<强>更新

使用fflush(3)强制写入缓冲区。

请参阅http://asciinema.org/a/6586