aus Python anderes Programm starten und Benutzereingeben eingeben

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
Honig
User
Beiträge: 11
Registriert: Mittwoch 9. Januar 2019, 09:18

Mittwoch 9. Januar 2019, 09:39

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
Sirius3
User
Beiträge: 9887
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 9. Januar 2019, 10:43

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.
Honig
User
Beiträge: 11
Registriert: Mittwoch 9. Januar 2019, 09:18

Mittwoch 9. Januar 2019, 11:04

Es ist ein Konsolen-Programm, dann werde ich es mal mit process.stdin.write probieren. Danke mal für deine Antwort.
Benutzeravatar
__blackjack__
User
Beiträge: 3350
Registriert: Samstag 2. Juni 2018, 10:21

Mittwoch 9. Januar 2019, 11:28

@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.
“I am Dyslexic of Borg, Your Ass will be Laminated” -- unknown
Sirius3
User
Beiträge: 9887
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 9. Januar 2019, 11:34

Vielleicht ist dann auch das pexpect-Modul hilfreich.
Honig
User
Beiträge: 11
Registriert: Mittwoch 9. Januar 2019, 09:18

Mittwoch 9. Januar 2019, 11:37

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.
Sirius3
User
Beiträge: 9887
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 9. Januar 2019, 11:49

Um was für ein Programm handelt es sich denn?
Honig
User
Beiträge: 11
Registriert: Mittwoch 9. Januar 2019, 09:18

Samstag 19. Januar 2019, 17:13

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.
Antworten