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.