Abfangen von Ausgaben auf die Standardausgabe

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.
bene
User
Beiträge: 5
Registriert: Freitag 4. April 2008, 10:36

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
bene
User
Beiträge: 5
Registriert: Freitag 4. April 2008, 10:36

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?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
bene
User
Beiträge: 5
Registriert: Freitag 4. April 2008, 10:36

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 ;)
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Ich frage mich mittlerweile, wieso du nicht einfach den print rauswerfen kannst, wenn es doch dasselbe Programm ist?
bene
User
Beiträge: 5
Registriert: Freitag 4. April 2008, 10:36

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...
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

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!"
bene
User
Beiträge: 5
Registriert: Freitag 4. April 2008, 10:36

Hi Jan-Peer!

Danke, an sowas in der Art hatte ich gedacht, allerdings schade, dass es da keine mitgelieferte Methode gibt...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``alt_stdout`` heißt übrigens ``sys.__stdout__``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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'
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

dein bespiel gibt mir gar nichts aus :?
aber bei meinem code dafür alles :shock: :shock: :shock:
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

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

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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wie hast Du das versucht?
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vermutlich schreibt eine dahinter liegende Bibliothek in ihre "eigene" Ausgabe an Python vorbei...
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fire Spike: Was hat denn ``vlc`` mit Deinem Python-Programm zu tun? Wie bindest Du das ein?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten