2010-03-14 5 views
0

파이썬 프로세스와 C++ 프로그램 간의 통신 파이프 라인에서 EOF 및 stdio에 몇 가지 문제가 있습니다. 내가 뭘 잘못하고 있는지 전혀 모르겠다. 프로그램에서 EOF를 볼 때 나는 표준 입력을 삭제하고 다음 라운드에서 새로운 행을 읽으려고합니다. 문제는 다음과 같습니다. getline 함수 immediatly (두 번째 실행에서 항상 처음 의도 한대로 작동 함)는 파이썬 프로세스의 새 입력을 기다리는 대신 EOF를 반환합니다. 어떤 생각입니까?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는 하나의 샷 기능입니다

괜찮아 여기에 코드입니다. 지정된 입력을 프로세스에 보내고 입력 스트림을 닫고 출력 스트림을 읽은 다음 프로세스가 종료 될 때까지 기다립니다.

"통신 중"같은 프로세스로 파이프를 '다시 시작할 수있는 방법이 없습니다.

반대로 파이프의 다른면에서 EOF을 읽을 때 더 이상 읽을 데이터가 없습니다. 읽으려는 시도는 즉시 EOF을 반환합니다. 파이썬이 파이프를 닫았습니다.

당신이 하위 프로세스 'stdinstdout 회원이 아닌 communicate를 사용합니다 (그러나 교착 상태의 가능성에주의) 할 필요가 같은 파이프와 통신을 계속하고 신호를 스트림의 마지막에보다 다른 것을 사용하려면

C++ 측에서 처리의 또 다른 "배치"를 수행해야한다는 것입니다.