subprocess Live Output

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
s0pply
User
Beiträge: 2
Registriert: Montag 23. März 2026, 19:53

Hallo zusammen,

bin neu in der Sprache Python und schreibe mir eine kleine Linux Shell Anwendung.
Ich Starte in meinem Script ein Subprocess der Live ausgegeben werden soll, soweit
klappt auch alles, nun möchte ich bei der Ausgabe ein ">>> " davor einsetzen, nun
habe ich aber kein Ansatz Punkt oder im Netz was gefunden, was zu meinen Code
passen würde:

Code: Alles auswählen

    while True:
        out = process.stdout.read(1)
        if out == "" and process.poll() != None:
            break
        if out != "":
            sys.stdout.write(out)
            sys.stdout.flush()
wenn ich in der zweiten Zeile readline verwende, kann ich die Ausgabe anpassen, wie
ich möchte aber leider muss ich (aktuell) read(1) nutzen, da auch eine Eingabe erforderlich
ist und die Frage in der Zeile dazu nicht angezeigt wird.
Komme gerade nicht mehr weiter, könnt Ihr mir da Helfen.

Gruß
Benutzeravatar
Dennis89
User
Beiträge: 1717
Registriert: Freitag 11. Dezember 2020, 15:13

Code: Alles auswählen

sys.stdout.write(f">>>{out}")
https://docs.python.org/3/tutorial/inpu ... -f-strings

Die zweite `if`-Abfrage ist überflüssig, weil wenn die erste wahr ist, dann bricht die Schleife ab und die zweite Abfrage, wird nicht abgefragt. Ist die erste Abfrage nicht wahr, soll geschrieben werden, also brauch man da `out` nicht noch einmal abfragen. `None` prüft man eher mit `is not None` und `out == ""` könnte man mit ` if not out` abfragen.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
s0pply
User
Beiträge: 2
Registriert: Montag 23. März 2026, 19:53

Guten Morgen,

Danke für die Antwort, das mit den IF Anweisung ist mir so gar nicht ins Auge gefallen, habe dies so geändert.

Habe das mit der "f" Ausgabe schon Probiert, bekomme dann aber vor jedem Zeichen meine Symbole.

Code: Alles auswählen

>>> p>>> a>>> s>>> s>>> w>>> o>>> r>>> d>>> :>>>  >>> >> [>>> 0>>> m
da ich in meiner subprocess Shell=True habe und wie man sieht, dann eine Password Abfrage, kann
ich stdout.readline nicht nutzen, da die Aktuelle Zeile hier nicht Ausgegeben wird, dies geht nur mit
read(1).....
Aber ich möchte gern den Output Formatieren...

Gruß
Benutzeravatar
__blackjack__
User
Beiträge: 14360
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@s0pply: Das mit dem ``if`` war schon sinnvoll so, das kann man nicht einfach weg lassen ohne die Semantik zu ändern, aber man kann das so schreiben, dass nicht zwei mal ein Test gegen den gleichen Wert gemacht wird:

Code: Alles auswählen

    while True:
        out = process.stdout.read(1)
        if out:
            sys.stdout.write(out)
            sys.stdout.flush()
        elif process.poll() is not None:
            break
        # Hier vielleicht ein Kommentar warum es okay ist im ``else``-Fall einfach nix zu tun.
        # Und warum man nicht einfach nur auf out = "" wartet, sondern das hier verkompliziert.


Du darfst die ">>>" halt nicht bei _jedem_ Zeichen ausgeben, sondern nur vor einem Zeichen, dass nach einem Zeilenendezeichen kommt.

Warum ist ``shell=True`` denn notwendig? Also ist es das wirklich? Weil Du da ja dann nicht mit dem anderen Programm direkt kommunizierst, sondern mit der Shell die mit dem anderen Programm kommuniziert.
“It is easier to optimize correct code than to correct optimized code.” — Bill Harlan
Antworten