2014-02-10 3 views
0

Я запускаю приведенный ниже код, который запускает приложение командной строки, которое работает около 40 минут. Пока это работает, кнопка QUIT недоступна, поэтому я не могу выйти из работающего приложения. Нижеприведенный код и кнопка расположены в их собственных def. Любые идеи относительно того, как я могу получить рабочую кнопку quit во время работы моего приложения?Не удается завершить работу во время работы. Команда Popen

command1 = transporterLink + " -m verify -f " + indir1 + " -u " + username + " -p " + password + " -o " + logPath + " -s " + provider1 + " -v eXtreme" 
master, slave = pty.openpty() 

process = Popen(command1, shell=True, stdin=PIPE, stdout=slave, stderr=slave, close_fds=True) 
stdout = os.fdopen(master) 
global subject 
subject = "Test" 
while True: 
    wx.Yield() 
    line = stdout.readline() 
    line = line.rstrip() 
    print line 
    if "Returning 1" in line: 
     result1 = "Verify FAILED!" 
     subject = "FAILED! - " 
     self.sendEmail(self) 
     break 
    if "Returning 0" in line: 
     result1 = "Verify PASSED!" 
     subject = "PASSED! - " 
     self.sendEmail(self) 
     break 
+0

Пожалуйста, объясните 'wx.Yield()'. Является ли это графическим приложением? С помощью какой GUI-структуры? (Мы могли догадаться, но не должны этого делать.) Как он называет код, который вы показываете выше? –

+0

извините, да, используя wxpython. – speedyrazor

ответ

0

stdout.readline блокирует до тех пор, пока что-то в stdout. Вы можете использовать select module's poll

command1 = transporterLink + " -m verify -f " + indir1 + " -u " + username + " -p " + password + " -o " + logPath + " -s " + provider1 + " -v eXtreme" 
master, slave = pty.openpty() 

process = Popen(command1, shell=True, stdin=PIPE, stdout=master, stderr=slave, close_fds=True) 
stdout = os.fdopen(master) 
import select 
q = select.poll() 
q.register(stdout,select.POLLIN) 
global subject 
subject = "Test" 
while True: 
    wx.Yield() 
    events = q.poll(0) 
    for fd, flags in events: 
     assert(fd == stdout.fileno()) 
     line = stdout.readline() 
     print line 
     if "Returning 1" in line: 
      result1 = "Verify FAILED!" 
      subject = "FAILED! - " 
      self.sendEmail(self) 
      sys.exit(0) 
     if "Returning 0" in line: 
      result1 = "Verify PASSED!" 
      subject = "PASSED! - " 
      self.sendEmail(self) 
      sys.exit(0) 
+0

Cheers Rems, с вашим кодом Я получаю line = line.rstrip() AttributeError: объект 'list' не имеет атрибута 'rstrip'. Если я выберу эту строку и просто распечатаю, я получаю бесконечный список из [(6,1)]. Я могу выйти с помощью кнопки, что хорошо, но я не получаю распечатку сейчас. – speedyrazor

+0

Обновлен код в соответствии с http://docs.python.org/2/library/select.html#select.poll.poll – Rems