Seite 1 von 1

stdout in StringIO umleiten

Verfasst: Sonntag 1. Januar 2023, 20:57
von Fire Spike
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.

Re: stdout in StringIO umleiten

Verfasst: Sonntag 1. Januar 2023, 21:14
von __blackjack__
@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.

Re: stdout in StringIO umleiten

Verfasst: Sonntag 1. Januar 2023, 22:53
von Fire Spike
Wie könnte ich die denn umleiten? Ich darf sie nicht einfach wegwerfen.

Re: stdout in StringIO umleiten

Verfasst: Sonntag 1. Januar 2023, 23:23
von __blackjack__
@Fire Spike: Bei echten Dateien bleiben nur echte Dateien, also wohl am sichersten/portabelsten tatsächlich Dateien auf einem Dateisystem.

Re: stdout in StringIO umleiten

Verfasst: Montag 2. Januar 2023, 09:29
von __deets__
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.

Re: stdout in StringIO umleiten

Verfasst: Montag 2. Januar 2023, 09:35
von Fire Spike
__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.

Re: stdout in StringIO umleiten

Verfasst: Montag 2. Januar 2023, 10:14
von Sirius3
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?

Re: stdout in StringIO umleiten

Verfasst: Montag 2. Januar 2023, 14:30
von Fire Spike
Zum Beispiel PySide6. Ich möchte da gewisse Sachen unterdrücken und andere durchlassen.

Re: stdout in StringIO umleiten

Verfasst: Montag 2. Januar 2023, 14:38
von __blackjack__
@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.

Re: stdout in StringIO umleiten

Verfasst: Montag 2. Januar 2023, 14:44
von Fire Spike
Ich dachte, dass das stören würde. Dass GUIs im allgemeinen Zeug ausgeben, ist mir noch nie aufgefallen.

Re: stdout in StringIO umleiten

Verfasst: Montag 2. Januar 2023, 14:46
von __blackjack__
@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.