2014-02-10 3 views
0

약 40 분 동안 실행되는 명령 줄 응용 프로그램을 실행하는 아래 코드를 실행 중입니다. 이것이 실행되는 동안 내 QUIT 버튼에 액세스 할 수 없으므로 실행중인 응용 프로그램을 종료 할 수 없습니다. 아래 코드와 버튼은 각각 def에 장착되어 있습니다. 내 응용 프로그램이 실행되는 동안 어떻게 작업 종료 버튼을 얻을 수 있는지에 대한 아이디어가 있습니까? stdout에 뭔가가있을 때까지긴 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 응용 프로그램입니까? 어느 GUI 프레임 워크를 사용합니까? (우리는 추측 할 수는 있지만 그렇게해서는 안됩니다.) 위에서 보여준 코드는 어떻게 호출합니까? –

+0

죄송합니다, 예, wxpython을 사용합니다. – speedyrazor

답변

0

stdout.readline은 차단하고 있습니다. 사용할 수 있습니다 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

건배 rems, 귀하의 코드와 함께 줄 = line.rstrip() AttributeError : '목록'개체에 'rstrip'속성이 없습니다. 그 라인을 꺼내 인쇄하면 [(6,1)]의 끝없는 목록을 얻습니다. 버튼을 사용하여 종료 할 수는 있지만 좋지만 지금 인쇄물을 가져 오지는 않습니다. – speedyrazor

+0

http://docs.python.org/2/library/select.html#select.poll.poll에 따라 코드가 업데이트되었습니다. – Rems