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

Abfangen von Ausgaben auf die Standardausgabe

Beitragvon bene » Freitag 4. April 2008, 10:45

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Abfangen von Ausgaben auf die Standardausgabe

Beitragvon gerold » Freitag 4. April 2008, 11:09

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

Beitragvon bene » Freitag 4. April 2008, 11:35

hi gerold!

Vielen Dank für deine schnelle Antwort :)

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

[code=]def methode(par)
print "total nerviger Output"
return par*par

var = methode(par)[/code]

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:

Beitragvon mkesper » Freitag 4. April 2008, 11:41

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

Beitragvon bene » Freitag 4. April 2008, 11:49

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:

Beitragvon mkesper » Freitag 4. April 2008, 12:00

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

Beitragvon bene » Freitag 4. April 2008, 12:05

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

Beitragvon Jan-Peer » Freitag 4. April 2008, 12:07

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

Beitragvon bene » Freitag 4. April 2008, 12:12

Hi Jan-Peer!

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

Beitragvon Leonidas » Freitag 4. April 2008, 12:44

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

Beitragvon Jan-Peer » Freitag 4. April 2008, 13:32

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 4. April 2008, 13:57

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: __deets__, Google [Bot]