2010-03-14 108 views
0

我在Python进程和C++程序之间的通信管道中遇到了EOF和stdio的一些问题。我不知道我做错了什么。当我在程序中看到EOF时,我清除stdin,然后下一轮尝试以新行的形式读取。问题是:出于某种原因,getline函数立即(从第二次运行始终,第一次正常工作)返回一个EOF,而不是等待来自python进程的新输入...任何想法?用stdio和C++/Python管道EOF问题

好吗下面是代码:

#include <string> 
#include <iostream> 
#include <iomanip> 
#include <limits> 

using namespace std; 

int main(int argc, char **argv) { 
    for (;;) { 
     string buf; 
     if (getline(cin,buf)) { 
      if (buf=="q") break; 
      /*****///do some stuff with input //my actual filter program 
      cout<<buf; 
      /*****/ 
     } else { 
      if ((cin.rdstate() & istream::eofbit)!=0)cout<<"eofbit"<<endl; 
      if ((cin.rdstate() & istream::failbit)!=0)cout<<"failbit"<<endl; 
      if ((cin.rdstate() & istream::badbit)!=0)cout<<"badbit"<<endl; 
      if ((cin.rdstate() & istream::goodbit)!=0)cout<<"goodbit"<<endl; 
      cin.clear(); 
      cin.ignore(numeric_limits<streamsize>::max()); 

      //break;//I am not using break, because I 
        //want more input when the parent 
        //process puts data into stdin; 
     } 
    } 

    return 0; 
} 

和蟒蛇:

from subprocess import Popen, PIPE 
import os 
from time import sleep 

proc=Popen(os.getcwd()+"/Pipingtest",stdout=PIPE,stdin=PIPE,stderr=PIPE); 

while(1): 
    sleep(0.5) 

    print proc.communicate("1 1 1") 
    print "running" 

回答

1

communicate在Python是一个拍功能。它将给定的输入发送给进程,关闭输入流并读取输出流,等待进程终止。

在“沟通”后,您无法使用相同的过程“重新启动”管道。

相反,在管道的另一端,当您读取EOF时,不会再有数据要读取。任何尝试阅读将立即返回EOF; python关闭了管道。

如果你想继续与您需要使用子stdinstdout成员,而不是communicate(但要小心死锁的潜力)相同的管道沟通,用其他的东西比流的结束信号C++端应该做另一个“批处理”处理。