2013-04-29 2 views
-1

다음은 현재 사용하고있는 기능입니다. 내가 퍼티 세션을 스폰하는 명령을 호출하면 퍼티 세션을 닫을 때까지 완전히 내 GUI 프로그램이 정지됩니다. 이 문제를 해결할 수있는 방법이 없으므로 명령을 호출하고 그저 따라 움직일 수 있습니까? (가 더 나는 명령에 전달하고,하지만 난 그것을 정리를 제거한Windows Python에서 명령을 전달한 후 이동하십시오.

def SpawnSessionrmt(self,event): 
    if "SSH" in self.protormt: 
     subprocess.call('C:/bin/putty.exe ',shell=True) 
    elif "RDP" in self.protormt: 
     subprocess.call('C:/bin/rdp.exe) 
    else: 
     print "Not that you will see this...but that isn't a valid protocol" 
+0

이 subprocess.Popen를 사용하려고) ... Queue 또는 Condition 주위에 내 자신의 스레드 간 통신을 쓰는 저를 강요 한 것 대신 : –

+0

는 처음에 당신이 사용하고있는 이유'쉘 = TRUE '이 있는가 ? 또는 명령 이름의 끝에 공백을 추가하는 것입니까? (운좋게도, 그것은'shell = True'로 Windows에서 작동하게 될 것입니다. 그러나 이것은 확실히 당신이 의지해야 할 것이 아닙니다.) – abarnert

답변

0

문제는 the docs 말하는대로, call는 것, 점이다. 명령이 설명

실행 인수에 의해. 반환 코드 속성을 다음 완료 반환 명령을 기다립니다.

당신이 명령이 완료되기를 기다리지 않으려면, call를 사용하지 않습니다. 그냥 Popen 인을 만들 (그리고 이상적으로는 나중에 wait, 종료시 또는 백그라운드 스레드에서). 예를 들어

: GUI를 응용 프로그램에 대한

def SpawnSessionrmt(self,event): 
    if "SSH" in self.protormt: 
     self.children.append(subprocess.Popen('C:/bin/putty.exe ',shell=True)) 
    elif "RDP" in self.protormt: 
     self.children.append(subprocess.Popen('C:/bin/rdp.exe')) 
    else: 
     print "Not that you will see this...but that isn't a valid protocol" 

def WaitForChildren(self): 
    for child in self.children: 
     child.wait() 

, 내가 할 수있는 가장 간단한 것은 단지 백그라운드 스레드로 subprocess.call을 넣어 것 같아요. 그렇게하면 실제 작업이 완료되면 GUI를 업데이트 할 수 있습니다.

불행하게도 각 GUI 프레임 워크는 다른 방법을 사용합니다. 일부는 어떤 스레드에서라도 GUI 작업을 수행하고 일부는 run_on_main_thread 함수를 가지고 있으며, 일부는 이벤트 루프에 의해 주 스레드에 이벤트를 게시하게합니다 , 일부는 사용자가 자신의 스레드 간 통신 시스템을 구축 할 것을 요구합니다. 그리고 어떤 GUI 프레임 워크를 사용하고 있는지 알려주지 않았습니다.

def SpawnSessionrmt(self,event): 
    if "SSH" in self.protormt: 
     cmd = 'C:/bin/putty.exe' 
    elif "RDP" in self.protormt: 
     cmd = 'C:/bin/rdp.exe' 
    else: 
     print "Not that you will see this...but that isn't a valid protocol" 
     return 
    def background_function(): 
     result = subprocess.call(cmd) 
     event = wx.CommandEvent(MY_UPDATE_ID) 
     event.SetInt(result) 
     self.GetEventHandler().AddPendingEvent(event) 
    t = threading.Thread(target=background_function) 
    t.daemon = True 
    t.start() 

(PS, 내가 wx을 싫어하기 때문에, 내 난수 생성기를 싫어 ...하지만 적어도이 Tkinter를 선택하지 않았다

그래서, 여기에 내가 무작위로 고른 하나의 프레임 워크, wx와 예입니다 , 어떤이

관련 문제