2017-05-12 14 views
-1

메인에서 프로세스를 시작한 다음 def 함수에서 종료하는 방법을 알고 싶습니다. 필자는 관심있는 애플리케이션을 실행하는 프로세스를 가지고있다. Tkinter를 사용하여 버튼을 기다리는 간단한 GUI를 실행하는 프로세스가있다. 이 버튼을 누르면 프로세스가 종료되기를 원합니다. 예를 들면 : 나는이 작업을 수행 할 때Python - 메인에서 시작된 프로세스 종료

def pro_a(): 
    #Runs the application 

def pro_b(): 
    root.mainloop() # Runs the GUI 

def buttonCallBack() 
    #I want to terminate the processes here 
    #I've tried doing: p1.terminate() 

b = Button(frame, .........., command = buttonCallBack) 
b.place(......) 

if __name__ == '__main__': 
    p1 = Process(target=pro_b) 
    p2 = Process(target=pro_a) 
    p1.start() 
    p2.start() 

, 그것은 나에게 오류 제공 : AttributeError: 'NoneType' object has no attribute 'terminate'

을하지만 난 main에 종료하려고 할 때, 그것을 작동합니다. 그러나 그것은 내가 원하는 것이 아닙니다. 분명한 것은, 메인에서 프로세스를 시작한 다음 버튼을 누르면 프로세스를 끝내야한다는 것입니다.

+0

어떻게'AttributeError'를 얻을지 모르겠다. 'NameError'를 얻었어야합니다. 왜냐하면'p1'은'buttonCallBack'이 볼 수있는 곳에서 정의되지 않았기 때문입니다. 당신의 모범에서 빠진 것이 있습니까? –

+0

나는 그렇게 생각하지 않는다. 관련 코드를 모두 포함 시켰습니다. 이상하게도, buttonCallBack 함수에 main에 넣은 코드를 넣으면 종료합니다 ... 작동합니다. 그것은 함수에서 그것을 끝낼 수있는 함수에서 프로세스를 시작해야 할 것으로 보인다. 그러나 그것은 내가 원하는 것이 아닙니다. – BBEng

+0

'p1'의 값을 다시 할당 하시겠습니까? –

답변

1

서브 프로세스에서 pro_b()을 시작하지 않으려면 pro_b()을 직접 호출하십시오. 제 생각에 pro_b() 자식 프로세스는 자식 프로세스 pro_a()에 대한 참조없이 끝나고 있습니다. pro_b()을 직접 호출하면 부모 프로세스에서 pro_a() 하위 프로세스가 종료됩니다.