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.
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. –
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
@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. –