문제는 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
와 예입니다 , 어떤이
이 subprocess.Popen를 사용하려고) ...
Queue
또는Condition
주위에 내 자신의 스레드 간 통신을 쓰는 저를 강요 한 것 대신 : –는 처음에 당신이 사용하고있는 이유'쉘 = TRUE '이 있는가 ? 또는 명령 이름의 끝에 공백을 추가하는 것입니까? (운좋게도, 그것은'shell = True'로 Windows에서 작동하게 될 것입니다. 그러나 이것은 확실히 당신이 의지해야 할 것이 아닙니다.) – abarnert