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

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: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

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

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: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

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

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: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

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

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