2009-10-21 4 views
6

나는 Popen을 사용하여 서브 프로세스를 시작하는 파이썬 프로그램을 작성 중이다. 하위 프로세스의 stdout을 읽고 필터링을 수행하고 주 프로세스의 stdout에 쓰고 있습니다.파이썬 프로세스가 종료되면 하위 프로세스를 종료 하시겠습니까?

주 프로세스 (cntl-C)를 종료하면 하위 프로세스가 계속 실행됩니다. 하위 프로세스도 어떻게 죽입니까? 하위 프로세스는 오랜 시간 실행하는 것과 같습니다.

컨텍스트 : 한 번에 하나의 하위 프로세스 만 실행 중이므로 표준 출력을 필터링하고 있습니다. 사용자가 다른 것을 시도하기 위해 인터럽트를 결정할 수 있습니다.

저는 파이썬에 익숙하지 않고 창을 사용하고 있습니다. 따라서 부드럽게 해주십시오.

답변

5

Windows에는 신호가 없으므로 신호 모듈을 사용할 수 없습니다. 그러나 Ctrl-C를 누르면 KeyboardInterrupt 예외를 catch 할 수 있습니다. 이 같은

뭔가 당신이 가야한다 :

import subprocess 

try: 
    child = subprocess.Popen(blah) 
    child.wait() 

except KeyboardInterrupt: 
    child.terminate() 
+2

Popen.wait()에 파이썬 문서에서 경고 : 자식 프로세스가 차단 대기되도록 표준 출력 또는 표준 오류 파이프에 충분한 출력을 생성하는 경우 교착 것이 경고 예를 들어

OS 파이프 버퍼가 더 많은 데이터를 받아 들일 수 있습니다. 이것을 피하려면 communicate()를 사용하십시오. –

+1

실제로'signal.signal (signal.SIGINT, handlerFunc)'는 파이썬 2.6.5에서 제대로 작동합니다 (r265 : 79096, 2010 년 3 월 19 일 21:48:26) win32에서 [MSC v.1500 32 비트 (Intel)] ; 방금 해봤 어. – RobM

0

subprocess.Popen 객체는 살인에 와서 종료 방법 (다릅니다은 당신이 과정에 보내는 신호).

signal.signal을 사용하면 신호 처리기를 설치할 수 있습니다.이 신호 처리기에서는 자식의 kill 메소드를 호출 할 수 있습니다.

0

파이썬 atexit 모듈을 사용할 수 있습니다.

import atexit 

def killSubprocess(): 
    mySubprocess.kill() 

atexit.register(killSubprocess) 
관련 문제