Seite 1 von 2

Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Freitag 4. April 2008, 10:45
von bene
Hi!

Ich habe folgendes Problem: Ich muss innerhalb meines Skripts eine Methode aufrufen, die hässlichen Output produziert, die ich aber nicht verändern kann. Daher meine Frage, ob es irgendwie möglich ist, Methoden auszuführen, die Ausgabe auf die Standardausgabe jedoch zu vermeiden.

Wäre super, wenn mir jemand helfen könnte... Hab leider noch nicht so viel Erfahrung mit python... freunde mich aber sehr schnell an ;)

Liebe Grüße
Bene

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Freitag 4. April 2008, 11:09
von gerold
Hallo Bene!

Willkommen im Python-Forum!

Das Modul "subprocess" bietet dafür "Popen" an. Suche einfach hier im Forum danach. Dann findest du massig Beispiele.

mfg
Gerold
:-)

Verfasst: Freitag 4. April 2008, 11:35
von bene
hi gerold!

Vielen Dank für deine schnelle Antwort :)

Ich stell mich aber anscheiend etwas dumm an... Wenn ich bspw. folgende Situation habe:

Code: Alles auswählen

def methode(par)
    print "total nerviger Output"
    return par*par

var = methode(par)
Wie kann ich das mit Popen lösen, sodass der "total nervige Output" nicht auf der Standardausgabe erscheint?

Verfasst: Freitag 4. April 2008, 11:41
von mkesper
subprocess funktioniert nur, wenn du ein anderes Programm aufrufst. Kannst du eventuell vor dem Start deines Programms die Standardausgabe umleiten? In der bash würde man das z.B. so machen:

Code: Alles auswählen

python nervprogramm.py >>ausgabe.log
So würden nur die Fehlermeldungen auf der Standardausgabe erscheinen.

Verfasst: Freitag 4. April 2008, 11:49
von bene
hi mkallas!

Ne, damit würde ja alles umgeleitet werden... Konkret gehts darum, dass die Methode, die ich benutzen muss, so gestrickt ist, dass sie einen defaultwert gibt, falls ein Fehler bei der Berechnung auftritt, und zusätzlich über den Standard-Ausgabestrom eine Meldung ob beim Berechnen alles geklappt hat... Dummerweise ist das keine Exception die man abfangen könnte, sondern einfach ein print "Hier ging was schief". Für mich spielt es aber keine Rolle, ob die Berechnung klappt oder nicht. Im Fehlerfall möchte ich einfach den defaultwert verwenden und auf auf die Konsole ausgeben (ohne die nervigen Meldungen der methode). Es soll also nur konkret von dieser einen Methode die print-Anweisung unterdrückt werden ;)

Verfasst: Freitag 4. April 2008, 12:00
von mkesper
Ich frage mich mittlerweile, wieso du nicht einfach den print rauswerfen kannst, wenn es doch dasselbe Programm ist?

Verfasst: Freitag 4. April 2008, 12:05
von bene
ich lade die Methode aus eine C++-Bibliothek und hab deswegen leider keinen Zugriff drauf... das habe ich vorhin verschwiegen, weil ich es nicht unnötig kompilziert machen wollte...

Verfasst: Freitag 4. April 2008, 12:07
von Jan-Peer
Häßlicher kleiner Hack:

Code: Alles auswählen

class dummy(object):
    def write(self, *args, **kwargs):
        pass

import sys

# altes stdout sichern
alt_stdout = sys.stdout

# stdout umbiegen
sys.stdout = dummy()

print "Diese Zeile wird nicht mehr zu sehen sein!"

# stdout wiederherstellen
sys.stdout = alt_stdout

print "Diese Zeile wird wieder angezeigt!"

Verfasst: Freitag 4. April 2008, 12:12
von bene
Hi Jan-Peer!

Danke, an sowas in der Art hatte ich gedacht, allerdings schade, dass es da keine mitgelieferte Methode gibt...

Verfasst: Freitag 4. April 2008, 12:44
von Leonidas
``alt_stdout`` heißt übrigens ``sys.__stdout__``.

Verfasst: Freitag 4. April 2008, 13:32
von Jan-Peer
Leonidas hat geschrieben:``alt_stdout`` heißt übrigens ``sys.__stdout__``.
Das letzte Mal, daß ich mich mit stdout beschäftigt habe, war vor etwa zehn Jahren, als ich unbedingt mit Python drucken wollte. Damals wußte ich noch nicht einmal, daß es so etwas wie einen Unterstrich auf meiner Tastatur gibt (Das kam dann später, bei if __name__ == "__main__" ) :lol:
Also wieder was gelernt. Jetzt müßte es nur noch so etwas wie ein eingebautes Dummy-Objekt geben, dann hätten wir wirklich nen Einzeiler.

Verfasst: Freitag 4. April 2008, 13:57
von Leonidas
Jan-Peer hat geschrieben:Jetzt müßte es nur noch so etwas wie ein eingebautes Dummy-Objekt geben, dann hätten wir wirklich nen Einzeiler.
Naja, da das eigentlich ein fieser Hack ist denke ich nicht dass die Entwickler so etwas hinzufügen werden, damit Hacks simpler werden.

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Sonntag 3. November 2019, 22:48
von Fire Spike
ich sah Jan-Peer's vorschlag aber er funktioniert nicht. gib es noch eine andere lösung?

Code: Alles auswählen

Exception ignored in: <__main__.dummy object at 0xb6747e10>
AttributeError: 'dummy' object has no attribute 'flush'

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Montag 4. November 2019, 03:26
von __blackjack__
Damals gab's das `contextlib`-Modul insgesamt wohl noch nicht. 🙂

Code: Alles auswählen

#!/usr/bin/env python3
import os
from contextlib import redirect_stdout


def main():
    with open(os.devnull, "w") as black_hole:
        with redirect_stdout(black_hole):
            print("Diese Zeile wird nicht mehr zu sehen sein!")

    print("Diese Zeile wird wieder angezeigt!")


if __name__ == "__main__":
    main()

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Montag 4. November 2019, 07:22
von Fire Spike
dein bespiel gibt mir gar nichts aus :?
aber bei meinem code dafür alles :shock: :shock: :shock:

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Montag 4. November 2019, 07:24
von sparrow
Fire Spike hat geschrieben: Montag 4. November 2019, 07:22 dein bespiel gibt mir gar nichts aus :?
Dann mussd das bei dir aber eine ganz besondere Situation sein ;) Der Code von __blackjack__ funktioniert wie er soll.

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Montag 4. November 2019, 07:29
von Fire Spike
also ich will diese

Code: Alles auswählen

[00cea078] vlcpulse audio output error: PulseAudio server connection failure: Connection refused
meldungen von vlc unterdrücken.
aber das funktioniert nicht wie es soll.

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Montag 4. November 2019, 07:54
von Sirius3
Und wie hast Du das versucht?

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Montag 4. November 2019, 09:54
von snafu
Vermutlich schreibt eine dahinter liegende Bibliothek in ihre "eigene" Ausgabe an Python vorbei...

Re: Abfangen von Ausgaben auf die Standardausgabe

Verfasst: Montag 4. November 2019, 10:53
von __blackjack__
@Fire Spike: Was hat denn ``vlc`` mit Deinem Python-Programm zu tun? Wie bindest Du das ein?