stdout in StringIO umleiten

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
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Hallo Leute

Ich möchte die stdout in einen StringIO umleiten. Mein Code funktioniert gut für Python, C und C++ Module können jedoch immer noch ausgeben.

Code: Alles auswählen

@contextmanager
def suppress_trash_in_stdout():
    sys.stdout.flush()
    old_stdout = sys.stdout
    sys.stdout = FakeStringIO(old_stdout)
    try:  
        yield

    finally:
        sys.stdout = old_stdout
FakeStringIO ist eine von StringIO abgeleitete Klasse.
Könnt ihr mir sagen, was daran falsch ist?
Ich habe schon zum Beispiel https://stackoverflow.com/a/50438156/20216649 gefunden, aber ich möchte es ja nur umleiten.
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Da würde man eher nach `os.devnull` umleiten und sich auch keinen Kontextmanager selber basteln, sondern `contextlib.redirect_stdout` verwenden. Falsch daran ist, das man damit halt nicht direkte Ausgaben über `stdout` vom Prozess erwischt. Und die Lösung dafür hast Du doch selbst verlinkt.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Wie könnte ich die denn umleiten? Ich darf sie nicht einfach wegwerfen.
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Bei echten Dateien bleiben nur echte Dateien, also wohl am sichersten/portabelsten tatsächlich Dateien auf einem Dateisystem.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann das schon erreichen, zumindest unter Unix. Durch Forken und abgreifen der file deskriptoren des Kind-Prozesses. Dann hat man in dem parent volle Kontrolle.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

__blackjack__ hat geschrieben: Sonntag 1. Januar 2023, 23:23 @Fire Spike: Bei echten Dateien bleiben nur echte Dateien, also wohl am sichersten/portabelsten tatsächlich Dateien auf einem Dateisystem.
Dann müsste ich es in eine Datei umleiten und die dann fortlaufend einlesen? Ich möchte den output nämlich verarbeiten.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

Was willst Du denn eigentlich machen? Es hört sich komisch an, dass Du die Ausgabe von Modulen, die in C geschrieben sind, innerhalb von Python aufrufen und deren (Debug-)Ausgabe weiterverarbeiten willst.
Was sind denn das für Module?
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Zum Beispiel PySide6. Ich möchte da gewisse Sachen unterdrücken und andere durchlassen.
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Warum? Das sieht man doch nur wenn man das Programm auf der Konsole startet, und da geben alle GUI-Rahmenwerke mehr oder weniger viele Warnungen und Debug-Meldungen aus.

Edit: Wobei man im Fall von Qt auch eher nicht bei der Standardausgabe ansetzen würde, sondern beim Logging-System von Qt. Nach kurzer Recherche scheint `qInstallMessageHandler()` ein interessanter Ansatzpunkt zu sein.
Zuletzt geändert von __blackjack__ am Montag 2. Januar 2023, 14:44, insgesamt 1-mal geändert.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

Ich dachte, dass das stören würde. Dass GUIs im allgemeinen Zeug ausgeben, ist mir noch nie aufgefallen.
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Normalerweise startet man GUIs ja auch nicht über eine Konsole. Und das ist natürlich unter Windows anders, da haben GUI-Anwendungen ja gar keine Textausgabe. Falls sich das nicht mittlerweile geändert hat.

Edit: Wobei man natürlich auch mit den Log-Leveln spielen kann wenn man nicht wirklich ein paar wenige Ausgaben filtern will, sondern ganze Kategorien.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten