Seite 1 von 1

aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Mittwoch 9. Januar 2019, 09:39
von Honig
Guten Tag,

ich möchte in Python ein Programm aufrufen und in diesen Programm Benutzereingaben eingeben. Die Benutzereingaben sollen auch von Python ,,eingegeben" werden.

Bis jetzt habe ich folgenden Code:

Code: Alles auswählen

import subprocess
process=subprocess.Popen(["command"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print process.communicate("Text1\r\n")[0]
Dabei habe ich jetzt aber das Problem, dass diese Benutzereingaben vom Programm nicht erfasst werden. Weiteres würde ich gerne mehrere Benutzereingaben machen, wenn ich aber nochmal communicate verwende bekomme ich die Fehlermeldung

Code: Alles auswählen

ValueError: I/O operation on cloed file.
Wird die Datei gleich nach dem ersten communicate geschlossen?

Hat vielleicht jemand eine Idee wie das ganze am besten geht? Auch ganz andere Ansätze sind willkommen, in Google habe ich bis jetzt noch nichts besseres gefunden..

Mit freundlichen Grüßen
Stefan

Re: aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Mittwoch 9. Januar 2019, 10:43
von Sirius3
Um was für ein Programm handelt es sich denn? Ein Konsolen-Programm? Oder Eingabefelder in einem Fenster?
Bei Konsole darfst Du nicht communicate benutzen, sondern mußt mit process.stdin.write arbeiten. Dabei mußt Du aber auch immer die Ausgabe des Programms mit process.stdout.read abfragen, weil sonst der Schreibpuffer vollläuft und das Programm blockiert.

Re: aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Mittwoch 9. Januar 2019, 11:04
von Honig
Es ist ein Konsolen-Programm, dann werde ich es mal mit process.stdin.write probieren. Danke mal für deine Antwort.

Re: aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Mittwoch 9. Januar 2019, 11:28
von __blackjack__
@Honig: Die Anmerkungen von Sirius3 nicht vergessen das die beiden anderen Pipes *gleichzeitig* behandelt werden müssen, damit es nicht zu einer Verklemmung wegen vollgelaufener Ausgabepuffer kommt. Das blöde daran ist, wie so oft bei nebenläufiger Programmierung, dass Du das falsch machen kannst, ohne dass es Dir sofort auf die Füsse fällt. Es ist dann trotzdem fehlerhaft, auch wenn es scheinbar ”funktioniert”. Du brauchst hier das `select`- oder das `threading`-Modul.

Re: aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Mittwoch 9. Januar 2019, 11:34
von Sirius3
Vielleicht ist dann auch das pexpect-Modul hilfreich.

Re: aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Mittwoch 9. Januar 2019, 11:37
von Honig
Ich habe jetzt folgenden Code:

Code: Alles auswählen

import subprocess
process=subprocess.Popen(["command"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
process.stdin.write(b"Text\r\n")
process.stdin.close()
print process.stdout.read()
Wenn ich den Code jetzt ausführe, bekomme ich die Programmzeilen vom Start des Programmes. Meine Benutzereingaben und die Antworten darauf bekomme ich nicht. :(

@__blackjack__ danke, ich werde mir das noch anschauen.
@Sirius3 werde ich mir auch anschauen.
Ich muss nur leider jetzt weg, und melde mich dann wieder.

Re: aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Mittwoch 9. Januar 2019, 11:49
von Sirius3
Um was für ein Programm handelt es sich denn?

Re: aus Python anderes Programm starten und Benutzereingeben eingeben

Verfasst: Samstag 19. Januar 2019, 17:13
von Honig
Guten Nachmittag,
es tut mir leid, dass ich erst jetzt antworte. Die letzte Zeit war für mich ein bisschen stressig.

Ich habe jetzt das pexpect-Modul ausprobiert und damit klappt es super, danke @Sirius3.

Mein fertiger Code jetzt:

Code: Alles auswählen

import pexpect
child = pexpect.spawn("command")
child.send("Hallo")
print child.readline()
@Sirius3 Das Programm ist leider ein nicht öffentliches Programm. Aber vielen Dank für eure Hilfe.