2011-02-23 3 views
5

Sto creando un'applicazione GUI (wxPython). Devo eseguire un'altra applicazione (.exe) dall'applicazione GUI. Il sottoprocesso eseguirà alcune operazioni su un'azione utente e restituirà un output all'applicazione GUICome eseguire un altro processo in un ciclo su un thread diverso

Sto eseguendo questo sottoprocesso in un ciclo, in modo che il sottoprocesso sia costantemente disponibile per l'esecuzione. Quello che sto facendo è che avvio un thread (quindi gui non si congela) e popò il sottoprocesso in un loop. Non sono sicuro se questo è il modo migliore.

self.thread = threading.Thread(target=self.run, args=()) 
self.thread.setDaemon(True) 
self.thread.start() 

def run(self): 
     while self.is_listening: 
      cmd = ['application.exe'] 
      proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
      proc.wait() 
      data = "" 
      while True: 
       txt = proc.stdout.readline() 
        data = txt[5:].strip() 
        txt += data 

Ora, ciò che accade è, se l'applicazione principale è l'arresto, il filo è ancora in attesa di un'azione dell'utente, che non è mai venuto. Come posso uscire in modo pulito? Il processo application.exe può ancora essere visualizzato nell'elenco dei processi, anche dopo l'uscita dall'app della GUI. Qualsiasi suggerimento per migliorare il tutto è benvenuto.

grazie

+2

Perché non stai usando 'wx.Process' /' wx.Execute() '? –

risposta

2

1) Fai 'proc' un attributo esempio, così si può chiamare Terminate() o uccidere() i metodi prima di uscire.

self.thread = threading.Thread(target=self.run, args=()) 
self.thread.setDaemon(True) 
self.thread.start() 

def run(self): 
    while self.is_listening: 
     cmd = ['application.exe'] 
     self.proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
     self.proc.wait() 
     data = "" 
     while True: 
      txt = self.proc.stdout.readline() 
      data = txt[5:].strip() 
      txt += data 

2) Usare qualche variabile per dire al filo di smettere (Sarà necessario utilizzare poll() in un ciclo, invece di utilizzare wait()).

self.exit = False 
self.thread = threading.Thread(target=self.run, args=()) 
self.thread.setDaemon(True) 
self.thread.start() 

def run(self): 
    while self.is_listening: 
     cmd = ['application.exe'] 
     proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
     while proc.poll() is None or not self.exit: 
      pass 
     data = "" 
     while True: 
      if self.exit: 
       break 
      txt = proc.stdout.readline() 
      data = txt[5:].strip() 
      txt += data 

Il 'atexit' module documentation può aiutare con chiamare le cose all'uscita.