2010-11-16 28 views
3

J'essaie de contrôler un simple programme C++ via python. Le programme fonctionne en invitant l'utilisateur à entrer. Les invites ne sont pas nécessairement terminées par endl. Ce que je voudrais savoir, c'est s'il y a un moyen de dire à python que le programme C++ ne génère plus de sortie et est passé à la demande d'entrée. Voici un exemple simple:Comment puis-je savoir quand un programme C++ attend une entrée?

C++

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x; 
    cout << "Enter a number "; 
    cin >> x; 
    cout << x << " squared = " << x * x << endl; 
} 

python:

#! /usr/bin/python 
import subprocess, sys 
dproc = subprocess.Popen('./y', stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
while (True) : 
    dout = dproc.stdout.read(1) 
    sys.stdout.write(dout) 
    dproc.stdin.write("22\n") 

Ce genre d'œuvres, mais écrit à dproc.stdin trop. Ce que je cherche à la place est un moyen de lire tout de dproc.stdout jusqu'à le programme est prêt pour l'entrée, puis écrire dans dproc.stdout.

Si possible, je voudrais le faire sans modifier le code C++. (Cependant, j'ai essayé de jouer avec la mise en tampon du côté C++ mais cela n'a pas semblé aider)

Merci pour vos réponses.

Répondre

3

Jetez un oeil à pexpect.

+0

J'ai regardé pexpect. La fonctionnalité pexpect semble fonctionner en lisant la sortie générée par le programme C++ et en analysant ces données. Je pourrais finir par le faire mais je cherchais quelque chose de plus général qui fonctionnerait même si vous n'avez aucune idée de la sortie que le programme C++ va générer. –

+0

Il n'y a aucun moyen de savoir si un programme attend une entrée; les tuyaux ne fournissent tout simplement pas cette fonctionnalité, malheureusement. – kindall

+0

@Dave: si le processus utilise 'select()' pour déterminer la disponibilité d'une réponse (c'est-à-dire "attente active"), il ne bloquerait pas en attendant une entrée de toute façon. C'est probablement pourquoi les tuyaux ne fournissent pas cette fonctionnalité en premier lieu. –

6

Je ne suis pas au courant d'un paradigme suffisamment général pour détecter que l'extrémité distante attend une entrée. Je peux penser aux moyens de base, mais aussi aux situations dans lesquelles ils échoueront. Exemples:

  1. lu avec un tuyau/socket non bloquant jusqu'à ce qu'aucune entrée arrive: la réaction peut être interrompue par l'écriture de processus sur le disque, attendre une réponse à partir d'une base de données, etc.
  2. Attendre jusqu'à ce que le processus devient inactif: un thread d'arrière-plan peut encore être en cours d'exécution.

Vous devez connaître le protocole utilisé par l'application que vous tentez de contrôler. Dans un sens, vous allez concevoir un interpréteur pour ce processus. pexpect est un jeu d'outils pour Python basé sur cette idée.