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
Abfangen von Ausgaben auf die Standardausgabe
- 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
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
hi gerold!
Vielen Dank für deine schnelle Antwort
Ich stell mich aber anscheiend etwas dumm an... Wenn ich bspw. folgende Situation habe:
Wie kann ich das mit Popen lösen, sodass der "total nervige Output" nicht auf der Standardausgabe erscheint?
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)
- 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:
So würden nur die Fehlermeldungen auf der Standardausgabe erscheinen.
Code: Alles auswählen
python nervprogramm.py >>ausgabe.log
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
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
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!"
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__" )Leonidas hat geschrieben:``alt_stdout`` heißt übrigens ``sys.__stdout__``.
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Naja, da das eigentlich ein fieser Hack ist denke ich nicht dass die Entwickler so etwas hinzufügen werden, damit Hacks simpler werden.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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- 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'
- __blackjack__
- User
- Beiträge: 13111
- 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
-
- 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
aber bei meinem code dafür alles
Dann mussd das bei dir aber eine ganz besondere Situation sein Der Code von __blackjack__ funktioniert wie er soll.
-
- User
- Beiträge: 329
- Registriert: Montag 13. Mai 2019, 16:05
- Wohnort: Erde
also ich will diese meldungen von vlc unterdrücken.
aber das funktioniert nicht wie es soll.
Code: Alles auswählen
[00cea078] vlcpulse audio output error: PulseAudio server connection failure: Connection refused
aber das funktioniert nicht wie es soll.
- __blackjack__
- User
- Beiträge: 13111
- 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