How to Get the Crash Errors When Embedding

Spam Hater never_spam_me at yahoo.com
Wed Sep 12 19:16:00 EDT 2001


Hi Howard:

I really like your class, and it does work for me with
a command line script.  However, when I use it with my
program that embeds python it causes the embedding
program to fail.  If I comment out 'import Tkinter'
and don't call "DebugWin.Take_all()" I can at least
import the script.

So...

1) is there anything special I have to do (like some
path problem) to use this TK code with a program that
embeds the python interpreter?

2) do I have to use this TK widget to get the
exception 'Traceback' dump? 

3) Were you using this technique with an embedded
python interpreter?  I seem to remember reading
somewhere that the exception dumps can't be
redirected?

--- Howard Lightstone <howard at eegsoftware.com> wrote:
> 
> 
> Spam Hater wrote:
> 
> > Hi All,
> >
> > I'm happily writing an app that embeds a python
> > interpreter within a graphical C program.
> >
> > My big problem for me is that when I have a python
> > interpreter exception, I can't see the stack dump.
> >
> > I've redirected sys.stderr and sys.stdout such
> that
> > errors should show up in a log file.  And they do,
> in
> > fact, if I run my Python script through the
> command
> > line interpreter.  But NOT when I run the
> surrounding
> > 'C' program.
> >
> > Yeah, I can write little test command line scripts
> to
> > try and cause problems to happen, but this doesn't
> > always help me track down 'insitu' problems and
> gets
> > quite tedious.
> >
> > Any help greatly appreciated!  --matt
> >
> > __________________________________________________
> > Do You Yahoo!?
> > Get email alerts & NEW webcam video instant
> messaging with Yahoo! Messenger
> > http://im.yahoo.com
> 
> Well, below is what I use.  It captures
> stdout/stderr and routes them to a
> separate Tkinter window which is created if needed. 
> When the program exits, if
> the separate window exists, it waits until that
> window is closed to 'really'
> exit (so you can read the contents).
> 
> To use, import DebugWin and call DebugWin.Take_all()
> before doing anything
> else.
> 
> 
> """
> #DebugWin.py
> 
> Pseudo debug screens
> 
> These capture stderr/std and route them to a Tkinter
> text widget.
> This implementation uses a common window for
> stdout/stderr with
> an asterisk at the beginning of each stderr line.
> 
> """
> import Tkinter
> import sys,string
> 
> class DbgText:
>     Dbgtopwin=None
>     Dbgwidget=None
>     DbgRoot=None
> 
>     def _kill_topwin(self):
>         DbgText.Dbgwidget=None
>         if DbgText.Dbgtopwin != None:
>             DbgText.Dbgtopwin.destroy()
>         DbgText.Dbgtopwin=None
> 
>     def __init__(self,kind=''):
>         self.kind=kind
>         self.window=None
>         self.widget=None
>         self.called=0
>         self.hide=0
>         self.buffer=''
> 
>     def __del__(self):
>         "On deletion, wait for user to see the
> output"
>         if DbgText.Dbgtopwin != None:
>             See()
>         self._kill_topwin()
> 
>     def write(self,charstr):
>         "write text to buffer or window"
>         if self.hide:
>             self.buffer.append(charstr)
>         else:
>             if self.window == None:
>                 if DbgText.Dbgtopwin == None:
>                     DbgText.Dbgtopwin=Tkinter.Tk()
> 
>
DbgText.Dbgtopwin.protocol('WM_DELETE_WINDOW',Dbg_kill_topwin)
>                    
> DbgText.Dbgwidget=Tkinter.Text(DbgText.Dbgtopwin)
>                     DbgText.Dbgwidget.pack(expand=1)
>                 top=DbgText.Dbgtopwin
>                 wid=DbgText.Dbgwidget
>             else:
>                 if self.widget == None:
>                    
> self.widget=Tkinter.Text(self.window)
>                 top=self.window
>                 wid=self.widget
>             if self.kind != '':
>                 ep=wid.index('end')
>                 sp=string.split(ep,'.')
>                 # determine length of 'previous'
> line
>                 prevl=int(sp[0])
>                 tx='\n'
>                 if prevl:
>                     pl='%d.0' % (prevl-1)
>                     tx=wid.get(pl,ep)
>                 # if this is start of a new line
>                 if tx[0] == '\n':
>                     wid.insert('end',self.kind)
>             wid.insert('end',charstr)
>         self.called=1
>         top.update()
> 
> def Dbg_kill_topwin():
>     f=DbgText()
>     f._kill_topwin()
> 
> def Take_stdout():
>     "DIsplay stdout in text widget"
>     if not isinstance(sys.stdout,DbgText):
>         f=DbgText()
>         f.prev=sys.stdout
>         sys.stdout=f
> 
> def Take_stderr():
>     "DIsplay stderr in text widget"
>     if not isinstance(sys.stderr,DbgText):
>         f=DbgText('*')
>         f.prev=sys.stderr
>         sys.stderr=f
> 
> 
> def Restore_stdout():
>     f=sys.stdout
>     if isinstance(f,DbgText):
>         sys.stdout=f.prev
>         del f
> 
> def Restore_stderr():
>     f=sys.stderr
>     if isinstance(f,DbgText):
>         sys.stderr=f.prev
>         del f
> 
> def Define_Root():
>     root=Tkinter.Tk()
>     root.withdraw()
>     DbgText.DbgRoot=root
> 
> 
> def See():
>     db=DbgText()
>     if db.Dbgtopwin != None:
>         db.Dbgtopwin.mainloop() # loop for me to see
> 
> def Take_all():
>     "send stderr/stdout to Tkinter text
> window/widget"
>     Take_stdout()
>     Take_stderr()
> 
> def Restore_all():
>     "restore stderr/stdout"
>     Restore_stdout()
>     Restore_stderr()
> 
> 
> if __name__ == '__main__':
>     print 'stdout is here'
>     Take_stdout()
>     print 'stdout should now be in window'
>     print ' this is the second line'
>     raw_input()
>     Restore_stdout()
>     print 'stdout back to original'
> 
> 
> 
> -- 
> http://mail.python.org/mailman/listinfo/python-list


__________________________________________________
Do You Yahoo!?
Get email alerts & NEW webcam video instant messaging with Yahoo! Messenger
http://im.yahoo.com




More information about the Python-list mailing list