2012-06-27 3 views
2

나는 파이썬에서 subprocess.Popen을 사용하여 일부 C++ 바이너리 애플리케이션을 실행 중입니다. 이 프로세스의 중단을 어떻게 처리 할 수 ​​있습니까? 예를 들어, 내 C++는 주장과 함께 나누기와 나는 콘솔에서 볼 :프로세스 검색 중단

binary: /usr/include/.../file.hpp:42: Assertion `min <= max' failed. 
Aborted 

프로세스가 종료하지만 어떻게 처리는 popen 사용하여 파이썬이를 잡으려고?

+0

프로세스 종료를 감지하거나 콘솔에서 출력을 catch 하시겠습니까? – luc

+0

@luc는 프로세스의 끝을 감지합니다. 'handle.wait()'는 도움이되지 않습니다. – Ockonal

답변

1

, 당신은 프로세스가 값 (일반적으로 완료되었는지 보여주고, 동시에 프로세스 핸들 개체의 returncode 속성 인, 어떤 시점에서, 전화 handle.wait(). Its return value을해야합니다> = 0) 또는 신호 (값이 < 인 0)로 인해 사망 한 경우.

예 :

#include <assert.h> 

int main() { 
    assert(0); 
} 

처럼 보이는 C 프로그램으로

>>> import subprocess 
>>> subprocess.call("kill -ABRT $$", shell=True) 
-6 
>>> a = subprocess.Popen("kill -ABRT $$", shell=True) 
>>> a.wait() 
-6 
>>> subprocess.call("kill -SEGV $$", shell=True) 
-11 

나는

>>> import subprocess 
>>> subprocess.call(["./ass"]) 
ass: ass.c:4: main: Assertion `0' failed. 
-6 

그래서 난 같은 효과를 할 수 있습니다.

1

SIGABRT 신호를 잡을 수 있습니다. 그러나 신호 처리기가 더 이상 충돌하지 않고 종료 된 후에는 계속 진행하지 못할 수도 있습니다.

어설 션을 일으키는 원인을 수정하려고 시도하는 것이 좋습니다. 당신이 handle = subprocess.Popen(...)를 호출 한 경우

+0

파이썬에서 신호를 잡는 법을 보여 줄 수 있습니까? – Ockonal

+0

@Ockonal 예 : ['signal'] (http://docs.python.org/library/signal.html) 모듈. 그러나 그것은 당신의 코드에서 뭔가 잘못되었다는 것을 나타냅니다, 나는 정말로 당신이 그것을 해결하기 위해 해결할 것을 제안합니다. –

+0

그 모듈은 자신의 프로세스가 아니라 파이썬 스크립트에서 sigabort를 잡는 데 사용됩니까? 지금은 큰 프로젝트의 다른 라이브러리 때문에 실패하기 때문에 고칠 수 없습니다. – Ockonal