2014-11-13 6 views
0

나는 C++로 작성된 프로그램을 가지고 있으며 예외를 만들기 위해 1/0을 나눕니다.파이썬 하위 프로세스 예외 처리

이 프로그램의 .exe는 Python의 서브 프로세스 라이브러리를 통해 실행됩니다. 내 목표는 파이썬 내에서 C++ 프로그램이 만드는 예외를 캡처하고 기록하는 것입니다.

p = subprocess.Popen(['C:\\Users\\name\\Desktop\\Win32Project1.exe']) 

이 코드 줄을 실행하면 p는 0이 아닌 값으로 오류가 발생했음을 의미합니다. Windows 7을 실행하고 Python 3.4.1을 사용합니다.

+0

:

은 그럼 당신은 뭔가 등을 말할 수있다. 아마도 [check_output] (https://docs.python.org/3.3/library/subprocess.html#subprocess.check_output)이 도움이됩니까? – FlorianLudwig

+1

_이 코드 줄이 실행될 때 p는 0이 아닌 값이므로 오류가 발생했음을 의미합니다. - 아니요, 이는 발생하지 않습니다. 'subprocess.Popen'은 절대로 0이 아닌 Popen 객체를 반환합니다. 원하는 경우'p.wait()'를 호출하고 리턴 코드를 얻을 수 있습니다. – tdelaney

답변

0

다른 프로세스의 예외를 추적 할 수 없다고 확신합니다. C++ 프로그램 내에서 예외를 try-catch하고 많은 프로세스 간 통신 수단 중 하나를 통해 예외를 전달해야합니다.

HTH, Cabbi

+0

windbg로 프로세스를 실행하면 예외를 추적하고 오류를 기록하므로 가능해야합니다. 필자의 경우 C++ 코드를 수정하여 수정하는 것은 불가능합니다. – KKK

+0

파이썬을 사용하여 플랫폼의 디버그 기능과 상호 작용할 수 있습니다. [파이썬에서 전화 걸기 디버그 후크] (https://www.google.com/search?client=ubuntu&channel=fs&q=call+windows+debug+hooks+from+python&ie=utf-8&oe=utf-8) 및 [winappdbg] (http://winappdbg.sourceforge.net/)와 같은 흥미로운 답변이 있습니다. 하지만 @cabbi에게 공정하기 위해서는 디버거를 작성하려고하지 않는다는 사실을 언급하면서 여기에서 그를 약간 블라인드해야합니다. 대부분의 사용자는 다른 프로그램에서 예외를 잡으려고 시도하지 않습니다. – tdelaney

+0

내가 찾은 최선의 해결책 (테스트하지 않았 음)은 새 응용 프로그램 도메인에서 프로세스를 시작하는 것입니다. 다음은 C#의 예제입니다. https://social.msdn.microsoft.com/Forums/vstudio/en-US/62259e21-3280-4d10-a27c-740d35efe51c/catch-another-process-unhandled-exception?forum=csharpgeneral – cabbi

0

노력이

cmd = ['C:\\Users\\name\\Desktop\\Win32Project1.exe'] 
out, err = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
print out # this prints the output of the execution 
print err # this prints if any error is returned 

나는 창문이없는, 그래서이 테스트되지 않지만 추가 정보를 원하시면, 당신을 도울 수있는 모습 here

0

에게 있습니다 다른 매개 변수를 subprocess.Popen에 전달하여 stdin 및 stderr의 위치를 ​​지정할 수도 있습니다. 당신이 반환 값() 표준 출력 및 표준 오류 파이프 + 기다려야을 처리해야합니다 필요가 얼마나 많은 컨트롤에 따라

p = subprocess.Popen('C:\\Users\\name\\Desktop\\Win32Project1.exe', stdout=PIPE, stderr=PIPE) 
(stdout_data, stderr_data) = p.communicate() 

rc = p.returncode 

# assume 0 return code means o.k. 
if rc: 
    parse_error(stderr_data) 
    # end if