2015-01-06 3 views
0

파이썬 스크립트가 있습니다. 아래 스크립트를 사용하여 다른 스크립트를 호출하고 있습니다.파이썬 하위 프로세스 예외 잡기

 sp = subprocess.Popen("script.py --arg1 --arg2', cwd=GIVEN_PATH, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

     while sp.poll() is None: 
      for out in iter(sp.stdout.readline,''): 
       self.log(out.rstrip()) 

이것은 잘 작동하지만 나는 script.py에서 예외를 얻고 싶습니다. 나는 우리가 retcode를 얻을 수 있지만 실제로 전체 예외 정보를 얻을 필요가 있음을 알고있다.

script.py이

  raise IOERROR("got an exception") 

을 제기하는 경우는이 정보를 알아야합니다. simailar 방법 우리는 sys.exc_info() 등

내가 할 수있는 방법이 무엇입니까?

+0

아래 답변에 더하여, 파이썬이 하위 프로세스 없이도 다른 파이썬 모듈을 직접 호출 할 수 있다는 점을 알아두면 유용합니다. 예외를 잡을 수 있습니다. 이 경우에해야 할 일입니다. – VooDooNOFX

답변

1

아니, 당신은 하위 프로세스에서 sys.exc_info()를 얻을 수 사전에

감사합니다 - 당신은 반환 코드를 볼 수있는 시간으로 자식 프로세스의 (스택 추적 포함) 메모리에있는 객체 이미 사라졌다.

stderr 출력을위한 별도의 파이프를 제공하고이를 읽음으로써 하위 프로세스가 stderr에 쓰는 텍스트를 구문 분석 할 수 있습니다. 프로그램이 stderr에 다른 것을 쓰지 않는다고 가정하면, 그 스트림에 나타날 유일한 텍스트는 오류 메시지와 스택 추적이됩니다.

프로세스가 버퍼링 할 수있는 것보다 더 많은 텍스트를 stderr에 쓰면 교착 상태가 발생할 수 있으므로이 방법을 사용할 때는주의해야합니다. 가장 좋은 해결책은 stdout과 stderr를 병렬로 읽는 별도의 스레드를 갖는 것입니다.

0

sys.exc_info()을 얻으려면 subprocess 모듈을 사용하는 대신 모듈을 가져 와서 기능을 실행할 수 있습니다. 다른 프로세스에서 실행해야하는 경우 multiprocessing 모듈을 사용할 수 있습니다.

또 다른 가능성은 execfile()을 사용하여 모듈을 상위 스크립트와 동일한 프로세스에서 스크립트로 실행하는 것입니다. 스크립트에 명령 줄 인수를 전달하려면 execfile()을 호출하기 전에 sys.argv 전역 목록을 조작 할 수 있습니다.

아니면 subprocess + execfile 방법을 결합 할 수 있습니다 : 아이 스크립트를 실행 execfile을 사용하고, 모든 예외를 직렬화 래퍼 스크립트를 작성 (예를 들어, pickle 사용)하고 부모 스크립트에서 subprocess를 사용하여 래퍼 스크립트를 실행합니다. 자녀의 예외 정보를 삭제할 수 있도록 stderr를 별도로 캡처하십시오.

+0

감사합니다. 유일한 문제는 execfile()에서 볼 수없는 인수로 파이썬 파일을 실행해야한다는 것입니다. – user2891472

+0

@ user2891472 :'execfile()을 사용하여 시작된 스크립트에 명령 줄 인수를 전달하는 방법을 설명하는 답변을 업데이트했습니다.)' – jfs