stderr bei wx auf die cmd bzw. eine datei umleiten ...

Plattformunabhängige GUIs mit wxWidgets.
Antworten
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

hallo,
ich hab in diesem Programm einen Fehler. Um genau zu sein fehlt in Zeile 16 das self als Parent für den wx.Panel . Naja, soweit so gut, aber ich würde gerne dei Fehlerausgabe irgendwo ausgeben (ganz normal in der cmd(windows) würde mir ja schon reichen, Datei wäre natürlich besser). habe schon ein wenig probiert ... habe es schon mit subprocess versucht-->ergebnis sehr bescheiden ... hier sieht mann, dass ich stderr etc. vor dem App()-Aufruf speichere und danach wieder zuweise ... problematisch ist hal, dass dies irgendwie nur für stdout (problemlos) klappt, aber nicht für stderr ... hat jemand eine ahnung wie man das machen kann?

grüße
cime
PS: wieso ich das machen will? ganz einfach, schon in diesem miniprog habe ich ewigkeiten gebraucht um den Fehler zu finden und ich würde diese zeit einfach gerne kürzen
PS2: 'table.jpg' in Zeile 12 ist einfach irgendeine Bilddatei (wer hätte es gedacht), sie wird eifnach nur angezeigt (diese miniprog ist die sgrundlage für ein etwas größeres ...)

hier der quellcode:

Code: Alles auswählen

import sys

import wx

#import const



class Frame(wx.Frame):
    
    def __init__(self):
        image = wx.Image('table.jpg', wx.BITMAP_TYPE_JPEG)
        temp = image.ConvertToBitmap()
        size = temp.GetWidth(), temp.GetHeight()
        wx.Frame.__init__(self, None, -1, 'Titel', wx.DefaultPosition, size)
        self.panel=wx.Panel()
        
        self.bmp=wx.StaticBitmap(parent=self.panel, bitmap=temp)
        self.SetClientSize(size)


class App(wx.App):

    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True

def main():
    out=sys.stdout
    err=sys.stderr
    inp=sys.stdin
    app = App()
    sys.stdout=out
    sys.stderr=err
    sys.stdin=inp
    app.MainLoop()
    

if __name__ == '__main__':
    main()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi cime!

Leite App nicht von ``wx.App``, sondern von ``wx.PySimpleApp`` ab, dann wird alles auf die Konsole geschrieben.

Code: Alles auswählen

class App(wx.PySimpleApp):

    def OnInit(self):
        self.frame = Frame()
        self.frame.Show()
        return True


def main():
    app = App()
    app.MainLoop()
   

if __name__ == '__main__':
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@gerold:
Das geht doch auch mit wx.App, wenn man als Argument False übergibt.
@cime:
Du kannst die Fehler auch über eine beliebige Klasse, die lediglich eine write-Methode haben muss, ausgeben:

Code: Alles auswählen

sys.stdout = meine_fehlerausgabe_instanz
mein_code()
sys.stdout = sys.__stdout__
Zeile 3 stellt wieder die Standardeinstellung her.
MfG
HWK
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

HWK hat geschrieben:@gerold: Das geht doch auch mit wx.App, wenn man als Argument False übergibt.
Hi HWK!

Es gibt meistens mehrere Möglichkeiten. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

also ersteinmal ein großes Danke, es klappt jetzt ... habe die Variante mit wx.App und False als Argument gewählt ...

noch eine kleine Frage, in die Richtung ... ich habe wie gesagt ein wenig mit subprocess rumgespielt (zum ersten mal, deswegen kenne ich mich da nicht so aus ...) und hier ist halt ein mini debug programm entstanden ...
leider habe ich dort den pfad zur python executable im code festeglegt, mir wäre es aber lieber, wenn dies vom programm ausgelesen wird ... natürlich könnte man das bestimmt mit regestry-Einträgen machen (bzw. diese auslesen), aber dies wäre für so etwas zu umständlich, denke ich ... es gibt doch bestimmt irgendwo eine Konstante, wo dieser Pfad drin steht, oder? weiß jemand, welche das ist?
mfg
cime

PS: der kurze Code

Code: Alles auswählen


import subprocess
import sys

f=open('ausg.txt','w')

p=subprocess.Popen([r'C:\Python25\python.exe', sys.argv[1]], stdin=sys.stdin, stdout=sys.stdout,stderr=f)
f.close()
res=p.wait()
print ':',res,':'
PS2: ir ist dabei übrigens aufgefallen, dass wenn ich eine Eingabe bspw.:

Code: Alles auswählen

raw_input('Eingabe: ')
erstelle, wird 'Eingabe: ' in die Datei geschrieben, d.h. über stderr ausgegeben ... weiß jemand wieso dies so ist?

PS3: @HWK: du hast sys.stdout doch vorher meine_fehlerausgabe_instanz zugewiesen ... damit würdest du in der dritten Zeile doch nichts ändern, oder? du weist doch nur dieselbe instanz nochmal zu ... man müsste doch sys.stdout in einer anderen Variable speichern _bevor_ man es überschreibt und wenn man das ganze wieder rückgängig machen will dann wieder von dieser Variable zurück auf sys.stdout zuweisen, oder? hatte mich nur gewundert ...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

cime hat geschrieben:den pfad zur python executable
Hi cime!

``sys.executable``
``sys.exec_prefix``

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Dankeschön!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

__stdin__
__stdout__
__stderr__

These objects contain the original values of stdin, stderr and stdout at the start of the program. They are used during finalization, and could be useful to restore the actual files to known working file objects in case they have been overwritten with a broken object.
MfG
HWK
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

sorry, okay hattest recht, hatte die Unterstriche übersehen ... so mach das ganze natürlich sinn
Antworten