Externes Programm aufrufen, welches Input erfordert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
S0S
User
Beiträge: 50
Registriert: Samstag 9. Februar 2013, 18:59

Hallo,

ich habe ein in C++ geschriebenes Programm, in welches ich nacheinander zwei Zahlen eingeben muss und das mir dann das Produkt ausgibt. Dieses möchte ich jetzt mit Hilfe von Python aufrufen, ihm die beiden Zahlen geben und es wieder schließen. Schön wäre, wenn ich die Konsolenausgabe dann auch noch in eine Datei schreiben könnte. Was ich bisher habe:

Code: Alles auswählen

import subprocess
import pyautogui
import time

process = subprocess.Popen(["C:\Users\Susanne\Documents\Visual Studio 2015\Projects\ConsoleApplication1\Release\ConsoleApplication1.exe"])

time.sleep(1)
pyautogui.typewrite("5")
pyautogui.press("enter")
time.sleep(1)
pyautogui.typewrite("6")
pyautogui.press("enter")
time.sleep(3)
pyautogui.press("enter")
Probleme dabei:
- Das Programm zur Multiplikation von zwei Zahlen ist nur ein Testprogramm. Das eigentliche Programm führt eine längere Rechnung aus, deren Dauer von der Eingabe abhängt. Mit obigem Weg müsste ich dann vorher abschätzen, wie lange die Rechnung maximal dauert und das Programm so lange pausieren lassen, was ziemlich unpraktisch ist und lange dauert.
- Auf die Ausgabe kann ich in Python nicht zugreifen.

Was ich mir bisher angeschaut habe, sind eine Umleitung der Ein- und Ausgabe mit stdin=subprocess.PIPE und stdout=subprocess.PIPE. Was ersteres tut und ob es überhaupt zur Lösung meines Problems beitragen kann, verstehe ich nicht so ganz.

Leite ich die Ausgabe um, habe ich keine Möglichkeit mehr, in der Konsole eine Eingabe der Zahlen zu tätigen. Außerdem kenne ich das Speichern der Ausgabe mittels check_output; wenn ich das verwende, läuft das Python-Skript jedoch erst weiter, wenn das Programm beendet ist, sodass ich damit keine Zahlen eingeben kann.

Danke schon mal im Voraus für eure Antworten!

PS: Der Vollständigkeit halber noch das C++ Programm.

Code: Alles auswählen

#include <iostream>

int main()
{
	int a, b, c;
	std::cout << "Zahl 1: ";
	std::cin >> a;
	std::cout << "Zahl 2: ";
	std::cin >> b;
	c = a * b;
	std::cout << "Ergebnis: "<< c;

	std::cout << "\n\n";
	std::system("pause");
	return 0;
}
BlackJack

@S0S: Umleiten der Ein- und Ausgaben des Programms ist schon die richtige Idee. Und dann mit `Popen.communicate()` die entsprechenden Eingaben an das Programm übergeben.
S0S
User
Beiträge: 50
Registriert: Samstag 9. Februar 2013, 18:59

Super, das funktioniert! Vielen Dank!

Hier noch mal der Code, falls andere das gleiche Problem haben:

Code: Alles auswählen

import subprocess
import pyautogui

process = subprocess.Popen(["C:\Users\Susanne\Documents\Visual Studio 2015\Projects\ConsoleApplication1\Release\ConsoleApplication1.exe"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
a = process.communicate("5\n6\n\n")
print "Output: ", a[0]
Antworten