Verständnisproblem: Ein-/Ausgabe von Programmen mit Popen ?

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
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Hallo Spezialisten,

ich möchte die Ausgaben eines (externen) Programmes in meinem Python-Programm verwenden und auch was an dieses Programm senden. Also so, als ob ich das Programm im Terminal selber bediene.

Mein Code:

Code: Alles auswählen

from subprocess import Popen, PIPE, STDOUT
import time

p = Popen('/usr/bin/axcall -r -S -R ax0 db0fhn',shell=True,stdout=PIPE,stdin=PIPE)

print (p.stdout.read())

time.sleep(3)

p.stdin.write("q\r")

time.sleep(3)

print (p.stdout.read())

Fragen:
  • Obwohl das Programm bereits etwas ausgibt (in meinem Fall: ASCII-Text), wird es mit dem ersten print-Befehl nicht angezeigt. Erst bei Auftreten eines Fehlers o.ä. wird der Text angezeigt.
  • Wie kann ich prüfen, ob das Programm etwas ausgegeben hat, um ggf. andere Aufgaben durchzuführen, wenn das Programm nichts ausgibt?
Gruß
Max
Zuletzt geändert von Octeon am Freitag 15. März 2019, 20:17, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

`stdout.read` liest so lange, bis das Programm fertig ist. Da es aber auf Eingaben wartet, ist das nie der Fall. Um interaktiv mit einem Programm zu arbeiten, gibt es pexpect.
Octeon
User
Beiträge: 14
Registriert: Sonntag 23. September 2018, 08:08

Ok, aber wenn ich nicht weiß, was ich "expecten" soll, denn da kann im Prinzip alles kommen....
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octeon: Wenn Du nicht weisst was Du erwartest, nach welchem Kriterium sendest Du denn dann Deine Eingabe? Drei Sekunden warten ist kein robustes Kriterium. Kann man natürlich trotzdem machen in dem Du auf EOF wartest, was ja nicht kommen dürfte, aber eine Zeitüberschreitung von drei Sekunden setzt (`timeout`-Argument).
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten