2013-11-30 6 views
4

У меня есть две программы, которые работают параллельно. Я хочу перенаправить выходной поток на одну программу на входной поток другой программы. Я пробовал трубопровод, но кажется, что выход первой программы перенаправляется на вход второй программы только по окончании первой программы. Но, мое требование не так. Например первая программа 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() 

Мое требование второй программы следует читать вывод из первого как только он напечатает номер, и ни одна из двух программ не завершится.

Как я могу это достичь?

+0

В какой ОС вы находитесь? – user2357112

+0

Я нахожусь на ubuntu OS – svKris

ответ

2

Это потому, что UNIX буферизирует stdin, когда обнаруживает, что это труба. Что действительно происходит, так это то, что вывод первой программы хранится в буфере до тех пор, пока он не достигнет определенного размера или пока программа не завершится (в зависимости от того, что произойдет раньше - это довольно большой буфер, чтобы вы сначала попали во второе условие) буфер считается полным, он отправляется как вход во вторую программу.

Таким образом, похоже, что вы хотите, чтобы ваш второй (Python) ввод программы был только буферизированным по строке (как если бы вы запускали программу в интерактивном режиме, с ее stdin tty вместо трубы).

Модуль, который вы ищете, называется pexpect: http://pexpect.readthedocs.org/en/latest/.

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() 

UPDATE

Использование fflush(3) для принудительной записи буфера.

http://asciinema.org/a/6586

+1

в этом решении кажется, что программа python не читает вывод из программы c параллельно. После выполнения программы c программа python считывает выходные данные из c-программы и обрабатывает ее. Но мое требование не так. – svKris

+0

@svKris, я обновил код, чтобы использовать 'fflush' и' file.flush'. Проверьте это. – falsetru

Смежные вопросы