2010-03-14 3 views
0

J'ai eu quelques problèmes avec EOF et stdio dans un pipeline de communication entre un processus python et un programme C++. Je n'ai aucune idée de ce que je fais de mal. Quand je vois un EOF dans mon programme, j'efface le stdin et au prochain tour j'essaie de lire dans une nouvelle ligne. Le problème est: pour une raison quelconque, la fonction getline immédiatement (à partir de la deuxième exécution toujours, la première fonctionne comme prévu) renvoie un EOF au lieu d'attendre une nouvelle entrée du processus python ... Une idée?Pipeter des problèmes EOF avec stdio et C++/Python

bien Voici le code:

#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; 
} 

et en python:

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" 

Répondre

1

communicate en python est une fonction de prise de vue. Il envoie l'entrée donnée à un processus, ferme le flux d'entrée et lit les flux de sortie, en attendant que le processus se termine.

Il est impossible de «redémarrer» le tuyau avec le même processus après «communication».

A l'inverse, de l'autre côté du tuyau, lorsque vous lisez EOF il n'y a plus de données à lire. Toute tentative de lecture renverra immédiatement EOF; Python a fermé le tuyau.

Si vous voulez continuer à communiquer avec le même tuyau que vous devez utiliser le sous-processus stdin et stdout membres et non communicate (mais attention du potentiel de blocages) et utiliser autre chose que la fin du flux de signaux que le côté C++ devrait faire un autre "lot" de traitement.