перенаправить журнал подпроцесса на wxpython txt ctrl - PullRequest
1 голос
/ 14 ноября 2011

Я хотел бы получить журнал o / p из подпроцесса на основе Python. Вот часть моего кода. Как мне перенаправить мой журнал также на этот текст Ctrl Вот mytest.py:

import logging     
log=logging.getLogger('test')    
class MyTestClass():           
    def TestFunction(self) :    
    log.info("start function"
    # runs for 5 - 10 mins and has lots of log statments   
    print "some stuff"      
    log.info("after Test Function")
    # for now
    return a,b    
    #sys.exit(2)    

if __name__ == "__main__":   
  myApp=MyTestClass()  
  myApp.TestFunction()

Я делаю что-то подобное в моем maingui:

    class WxLog(logging.Handler):
           def __init__(self, ctrl):
                logging.Handler.__init__(self)
                self.ctrl = ctrl
           def emit(self, record):
                  if self.ctrl:
                        self.ctrl.AppendText(self.format(record)+"\n") 

и в моем графическом интерфейсе

    self.log = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE| wx.TE_RICH2)
    #logging.basicConfig(level=logging.INFO)
    self.logr = logging.getLogger('')
    self.logr.setLevel(logging.INFO)
    hdlr = WxLog(self.log)
    hdlr.setFormatter(logging.Formatter('%(message)s '))
    self.logr.addHandler(hdlr)

    #snip 

    prog = os.path.join(mydir,"mytest.py")
    params = [sys.executable,prog]
    # Start the subprocess
    outmode = subprocess.PIPE
    errmode = subprocess.STDOUT
    self._proc = subprocess.Popen(params,
                                      stdout=outmode,
                                      stderr=errmode,
                                      shell=True
                                     )


    # Read from stdout while there is output from process
    while self._proc.poll() == None:
         txt = self._proc.stdout.readline()
         print txt

    # also direct log to txt ctrl 
    txt =  'Return code was ' + str(self._proc.returncode) +'\n'   

    # direct     
    self.logr.info("On end ")

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Я написал статью о том, как перенаправить несколько вещей, таких как ping и traceroute, используя подпроцесс, в мой виджет TextCtrl здесь: http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/

Это может помочь вам разобраться.Вот более общая статья, в которой не используется подпроцесс: http://www.blog.pythonlibrary.org/2009/01/01/wxpython-redirecting-stdout-stderr/

Я еще не пробовал перенаправить с модулем ведения журнала, но это может быть то, что я сделаю в будущем.

1 голос
/ 14 ноября 2011

Вы можете попробовать следовать предложению в этом сообщении .

Обновление: Вы можете настроить регистратор в подпроцессе на использование SocketHandler и настроить сервер сокетов в графическом интерфейсе для прослушивания сообщений из подпроцесса, используя технику, связанную сообщение, чтобы на самом деле сделать вещи появляются в графическом интерфейсе. Работающий сервер сокетов включен в документацию по ведению журнала .

...