4

開発ショップで Python アプリケーションを実行しています。別の GUI アプリケーションから呼び出されます。失敗した場合、pdb 事後分析デバッグで停止した場所にコンソールを表示して、ユーザーが問題を抱えたときに何が起こっているかを確認できるようにしたいと考えています。

プログラムの上部にexcepthookを設定してみました:

def pcs_debugger(type, value, tb):
    traceback.print_exception(type, value, tb)
    pdb.pm()

sys.excepthook = pcs_debugger

そして、pythonw でコンソールを起動したときや、Python で書かれていない他の GUI アプリケーションから呼び出されたときなど、まだコンソールを持っていない場合を除いて、それはうまく機能します。

これを行う方法はありますか?ありがとう

更新:これはすべてWindows 7上にあることを忘れていました

更新: 最小限のコード例を追加します。これは、pythonw.exeではなくpython.exeで起動すると、希望どおりに機能することに注意してください。pythonwは、実際にこれをロードするC#GUIを持っている私の環境で行っていることにより似ていますdll 内の Python コード。

import pdb, sys, traceback, wx

def my_debugger(type, value, tb):
    traceback.print_exception(type, value, tb)
    pdb.pm()

sys.excepthook = my_debugger

class MyApp(wx.App):

    def OnInit(self):
        frame = MyFrame("Hello World", (50, 60), (450, 340))
        frame.Show()
        self.SetTopWindow(frame)
        return True

class MyFrame(wx.Frame):

    def __init__(self, title, pos, size):
        wx.Frame.__init__(self, None, -1, title, pos, size)
        menuFile = wx.Menu()
        menuFile.Append(1, "&About...")
        menuFile.AppendSeparator()
        menuFile.Append(2, "E&xit")
        menuFile.Append(3, "&Fail")
        menuBar = wx.MenuBar()
        menuBar.Append(menuFile, "&File")
        self.SetMenuBar(menuBar)
        self.CreateStatusBar()
        self.SetStatusText("Welcome to wxPython!")
        self.Bind(wx.EVT_MENU, self.OnAbout, id=1)
        self.Bind(wx.EVT_MENU, self.OnQuit, id=2)
        self.Bind(wx.EVT_MENU, self.OnFail, id=3)

    def OnQuit(self, event):
        self.Close()

    def OnAbout(self, event):
        wx.MessageBox("This is a wxPython Hello World Sample",
                      "About Hello World", wx.OK | wx.ICON_INFORMATION, self)

    def OnFail(self, event):
        a = 1
        b = 0
        self.SetStatusText('about to divide by 0')
        c = a / b
        print 'here it is {}'.format(c)
        return

if __name__ == '__main__':
    app = MyApp(False)
    app.MainLoop()
4

0 に答える 0