zoukankan      html  css  js  c++  java
  • 放一个半年前写的Python静态检查编译器

    使用了wxPython、pychecker编写的python静态编译器,用于在编译器查找py脚本的错误。
    开放源码,与各位pythoner共享之!

    from wxPython.wx import *
    import time
    import sys
    import pychecker.checker2
    import py_compile
    from compileall import compile_dir


    ID_SET_WORK_DIRECTORY   = wxNewId()
    ID_CLEAR                = wxNewId()
    ID_EXIT                 = wxNewId()

    ID_COMPILE_FILES        = wxNewId()
    ID_COMPILE_ONE          = wxNewId()
    ID_COMPILE_ALL          = wxNewId()
    ID_COMPILE_DIRECTORY    = wxNewId()

    ID_BUILD_FILES          = wxNewId()
    ID_BUILD_ONE            = wxNewId()
    ID_BUILD_ALL            = wxNewId()
    ID_BUILD_DIRECTORY      = wxNewId()

    ID_ABOUT                = wxNewId()

    ID_LIST                 = wxNewId()
    ID_REPORT               = wxNewId()
     
    class MyFrame(wxFrame):
        def __init__(self, parent, ID, title):
            wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, wxSize(640, 480))

            self.icon = wxIcon('cd2py.ico', wxBITMAP_TYPE_ICO)
            self.SetIcon(self.icon)

            self.statusbar = self.CreateStatusBar(2)
            self.statusbar.SetStatusWidths([-1, 130])
            self.statusbar.SetStatusText("Thanks for use cd2Py compiler...", 0)
            self.statusbar.SetStatusText(self.Time(), 1)
            self.CentreOnScreen()

            self.timer = wxPyTimer(self.Notify)
            self.timer.Start(1000)
            self.Notify()
           
            fmenu = wxMenu()
            fmenu.Append(ID_SET_WORK_DIRECTORY, "&Work Directory",  "Choose Tuntown2 directory")
            fmenu.Append(ID_CLEAR,              "&Clear",           "Clear the compile history")
            fmenu.AppendSeparator()
            fmenu.Append(ID_EXIT,               "E&xit",            "Terminate the program")

            cmenu = wxMenu()
            cmenu.Append(ID_COMPILE_ONE,        "Compile &one",     "Compile one selected file")
            cmenu.Append(ID_COMPILE_ALL,        "Compile &all",     "Compile all selected file(s)")
            cmenu.AppendSeparator()
            cmenu.Append(ID_COMPILE_FILES,      "&Files",           "Compile selected file(s)")
            cmenu.Append(ID_COMPILE_DIRECTORY,  "&Directory",       "Compile selected directory")

            bmenu = wxMenu()
            bmenu.Append(ID_BUILD_ONE,          "Build &one",       "Build one selected file")
            bmenu.Append(ID_BUILD_ALL,          "Build &all",       "Build all selected file(s)")
            bmenu.AppendSeparator()
            bmenu.Append(ID_BUILD_FILES,        "&Files",           "Build selected file(s)")
            bmenu.Append(ID_COMPILE_DIRECTORY,  "&Directory",       "Build selected directory")

            hmenu = wxMenu()
            hmenu.Append(ID_ABOUT,              "&About",           "More information about this program")
           
            menuBar = wxMenuBar()
            menuBar.Append(fmenu,   "&Files");
            menuBar.Append(cmenu,   "&Compile");
            menuBar.Append(bmenu,   "&Build");
            menuBar.Append(hmenu,   "&Help");
           
            self.SetMenuBar(menuBar)

            EVT_MENU(self, ID_SET_WORK_DIRECTORY,   self.OnSetWorkDirectory)
            EVT_MENU(self, ID_CLEAR,                self.OnClearHistory)
            EVT_MENU(self, ID_EXIT,                 self.OnQuit)

            EVT_MENU(self, ID_COMPILE_FILES,        self.OnCompileFiles)
            EVT_MENU(self, ID_COMPILE_ONE,          self.OnCompileOne)
            EVT_MENU(self, ID_COMPILE_ALL,          self.OnCompileAll)
            EVT_MENU(self, ID_COMPILE_DIRECTORY,    self.OnCompileDirectory)

            EVT_MENU(self, ID_BUILD_FILES,          self.OnBuildFiles)
            EVT_MENU(self, ID_BUILD_ONE,            self.OnBuildOne)
            EVT_MENU(self, ID_BUILD_ALL,            self.OnBuildAll)
            EVT_MENU(self, ID_BUILD_DIRECTORY,      self.OnBuildDirectory)

            EVT_MENU(self, ID_ABOUT,                self.OnAbout)

            EVT_SIZE(self,                          self.OnResize)
            EVT_CLOSE(self,                         self.OnClose)

            sizeClient = self.GetClientSize()

            self.List = wxComboBox(self, ID_LIST, "", wxPoint(0, 0),
                                    sizeClient, [""], wxCB_DROPDOWN | wxCB_READONLY)
            sizeList = self.List.GetClientSize()
            self.Report = wxTextCtrl(self, ID_REPORT, "", wxPoint(0, sizeList.height),
                                    wxSize(sizeClient.width, sizeClient.height-sizeList.height),
                                    wxTE_AUTO_URL |
                                    wxHSCROLL |
                                    wxTE_MULTILINE |
                                    wxTE_READONLY)

            self.cfg = ["\n", "\n", "\n"]
            try:
                f = open("config.cfg", "r")
                try:
                    self.cfg[0] = f.readline()
                    self.cfg[1] = f.readline()
                    self.cfg[2] = f.readline()
                except:
                    pass
                f.close()
            except IOError:
                pass

            self.save_sys_path = sys.path[:]
            curdir = self.cfg[0]
            curdir = curdir[0:len(curdir)-1]
            self.AddPath(curdir)


        def OnSetWorkDirectory(self, event):
            dlg = wxDirDialog(self, "Choose Tuntown Directory", self.cfg[0])
            if dlg.ShowModal() == wxID_OK:
                self.AddPath(dlg.GetPath())
                self.cfg[0] = dlg.GetPath()

            dlg.Destroy()


        def OnClearHistory(self, event):
            self.Report.Clear()


        def OnCompileFiles(self, event):
            dlg = wxFileDialog(self, "Open File(s) for compile", self.cfg[1],
                                "", "python script(*.py)|*.py", wxOPEN | wxMULTIPLE)
            if dlg.ShowModal() == wxID_OK:
                self.paths = dlg.GetPaths()
                self.List.Clear()
                self.Report.AppendText(self.CompileInfoHead("File(s)"))
                for path in self.paths:
                    print "Compiling " + path + " ..."
                    self.PyCheck(path)
                    self.List.Append(path)
                self.List.Select(0)
                self.Report.AppendText("=-- Compile Finished.\n\n")
                self.cfg[1] = dlg.GetDirectory()

            dlg.Destroy()


        def OnCompileOne(self, event):
            if self.paths.count != 0:
                self.Report.AppendText(self.CompileInfoHead("File"))
                path = self.paths[self.List.GetSelection()]
                print "Compiling " + path + " ..."
                self.PyCheck(path)
                self.Report.AppendText("=-- Compile Finished.\n\n")


        def OnCompileAll(self, event):
            if self.paths.count != 0:
                self.Report.AppendText(self.CompileInfoHead("File(s)"))
                for path in self.paths:
                    print "Compiling " + path + " ..."
                    self.PyCheck(path)
                self.Report.AppendText("=-- Compile Finished.\n\n")


        def OnCompileDirectory(self, event):
            dlg = wxDirDialog(self, "Select a directory for compile", self.cfg[2])
            if dlg.ShowModal() == wxID_OK:
                path = dlg.GetPath()
                self.Report.AppendText(self.CompileInfoHead("Directory:", path))
                sys.path.append(path)
                self.PyCheck(path + '\\*.py')
                sys.path.pop()
                self.Report.AppendText("=-- Compile Finished.\n\n")
                self.cfg[2] = dlg.GetPath()
                   
            dlg.Destroy()


        def OnBuildFiles(self, event):
            dlg = wxFileDialog(self, "Open File(s) for build", self.cfg[1],
                                "", "python script(*.py)|*.py", wxOPEN | wxMULTIPLE)
            if dlg.ShowModal() == wxID_OK:
                self.paths = dlg.GetPaths()
                self.List.Clear()
                self.Report.AppendText(self.CompileInfoHead("File(s)"))
                for path in self.paths:
                    print "Building " + path + " ..."
                    py_compile.compile(path, None, None)
                    self.List.Append(path)
                self.List.Select(0)
                self.Report.AppendText("=-- Build Finished.\n\n")
                self.cfg[1] = dlg.GetDirectory()

            dlg.Destroy()


        def OnBuildOne(self, event):
            if self.paths.count != 0:
                self.Report.AppendText(self.CompileInfoHead("File"))
                path = self.paths[self.List.GetSelection()]
                print "Building " + path + " ..."
                try:
                    py_compile.compile(path, None, None)
                except py_compile.PyCompileError, ex:
                    print ex
                self.Report.AppendText("=-- Build Finished.\n\n")


        def OnBuildAll(self, event):
            if self.paths.count != 0:
                self.Report.AppendText(self.CompileInfoHead("File(s)"))
                for path in self.paths:
                    print "Building " + path + " ..."
                    try:
                        py_compile.compile(path, None, None)
                    except py_compile.PyCompileError, ex:
                        print ex
                self.Report.AppendText("=-- Build Finished.\n\n")


        def OnBuildDirectory(self, event):
            dlg = wxDirDialog(self, "Select a directory for build", self.cfg[2])
            if dlg.ShowModal() == wxID_OK:
                path = dlg.GetPath()
                self.Report.AppendText(self.CompileInfoHead("Directory:", path))
                compile_dir(path, 10, None, 1, None)
                self.Report.AppendText("=-- Build Finished.\n\n")
                self.cfg[2] = dlg.GetPath()
                   
            dlg.Destroy()
       

        def OnAbout(self, event):
            dlg = wxMessageDialog(self, "Present by Dracula 2005\n"
                                        "Build 2005.05.05\n", "About",
                                        wxOK | wxICON_INFORMATION)
            dlg.ShowModal()
            dlg.Destroy()


        def OnResize(self, event):
            sizeClient = self.GetClientSize()
            self.List.SetSize(sizeClient)
            sizeList = self.List.GetClientSize()
            self.Report.SetSize(wxSize(sizeClient.width, sizeClient.height-sizeList.height))


        def OnClose(self, event):
            try:
                f = open("config.cfg", "w")
                f.write(self.cfg[0])
                if self.cfg[0][-1] != '\n':
                    f.write("\n")
                f.write(self.cfg[1])
                if self.cfg[1][-1] != '\n':
                    f.write("\n")
                f.write(self.cfg[2])
                f.close()
            except IOError:
                pass

            sys.path = self.save_sys_path[:]
           
            self.timer.Stop()
            del self.timer
            del self.icon
            self.Destroy()


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


        def PyCheck(self, argv):
            argv2 = ['pychecker']
            argv2.append(argv)
            pychecker.checker2.main(argv2)
            #reload(pychecker.checker2)


        def AddPath(self, path):
            curdir = path
            system_dir = curdir + '\\data\\script'
            system_core_dir = curdir + '\\data\\script\\core'
            subsystem_dir = curdir + '\\data\\subsystem'
            subsystem_trashbin_dir = curdir + '\\data\\subsystem\\trashbin'

            sys.path = self.save_sys_path[:]
            sys.path.append(curdir)
            sys.path.append(system_dir)
            sys.path.append(system_core_dir)
            sys.path.append(subsystem_dir)
            sys.path.append(subsystem_trashbin_dir)


        def CompileInfoHead(self, str1, str2=""):
            return "=-- %s %s Compile %s %s ...\n" % (self.Date(), self.Time(), str1, str2)
       

        def Error(self, error):
            self.Report.AppendText(error)


        def Output(self, info):
            self.Report.AppendText(info)


        def Date(self):
            t = time.localtime(time.time())
            strDate = time.strftime("%Y.%m.%d", t)
            return strDate


        def Time(self):
            t = time.localtime(time.time())
            strTime = time.strftime("%I:%M:%S", t)
            return strTime


        def Notify(self):
            self.statusbar.SetStatusText(self.Date() + "   " + self.Time(), 1)


    class MyApp(wxApp):
        def OnInit(self):
            self.frame = MyFrame(NULL, -1, "cd2Py Compiler")
            self.frame.Show(true)
            self.SetTopWindow(self.frame)
            return true

    cd2Py = MyApp(0)


    import sys

    class errCatcher:
        def __init__(self):
            pass
           
        def write(self, stuff):
            cd2Py.frame.Error(stuff)


    class outCatcher:
        def __init__(self):
            pass
           
        def write(self, stuff):
            cd2Py.frame.Output(stuff)

    sys.stderr = errCatcher()
    sys.stdout = outCatcher()

    cd2Py.MainLoop()

  • 相关阅读:
    简要描述客户端发送的http request header都包含哪些内容
    如何利用TestNG监听器优化测试报告
    TestNG 监听器 ITestListener
    p3317 [SDOI2014]重建
    EZOJ #387字符串
    EZOJ #386 最小生成树
    EZOJ #385 排列
    EZOJ #375高速公路
    EZOJ #374学习
    EZOJ #373排序
  • 原文地址:https://www.cnblogs.com/oiramario/p/283337.html
Copyright © 2011-2022 走看看