2014-07-15 1 views
0

Nose로 통합 테스트를 실행하고 있습니다. 내 테스트 중 하나에서 출력을 가져 와서 특정 문자열을 찾기 위해 구문 분석해야합니다.Python - 외부 프로그램을 실행하는 함수 호출에서 모든 출력 캡처

def test_diagnostic_tool(): 
    with Capturing() as output: 
     failures = run_integration_testing_exe('*', test_exe='DiagnosticTool.exe', use_default_composed_filter=False) 

    eq_(failures, 0) 


class Capturing(list): 
    def __enter__(self): 
     self._stdout = sys.stdout 
     sys.stdout = self._stringio = StringIO() 
     return self 

    def __exit__(self, *args): 
     self.extend(self._stringio.getvalue().splitlines()) 
     sys.stdout = self._stdout 

이것은 작동하지 않습니다. 'output'변수는 호출 구조의 어딘가에있는 작은 문자열 만 포함합니다.

'run_integration_testing_exe'함수가 다른 함수를 호출 중이고 외부 exe 프로그램이 호출되었습니다. 셸에서는 everthing 출력이 좋으므로 모든 내용을 캡처하고 구문 분석 할 수있는 방법이 있는지 궁금합니다.

+0

;-) 패치 할 수 있습니다 exe를 실행중인 경우'subprocess.Popen'이 호출됩니다. – deinonychusaur

+0

그럴 수 있으면 좋겠다. 이 함수는 테스트 프레임 워크의 일부이며 수정할 수 없습니다 (테스트 스크립트에서 가져옵니다). – Amaranth

+0

누락 된 항목이 stdout이 아닌 stdout에 실제로 쓰여졌습니까? 그렇지 않으면'DiagnosticTool.exe'를 시작하는 코드를 얻을 수 없다면 아마 파이썬 안에서 행운을 빕니다. – deinonychusaur

답변

1

Capturing 클래스의 sys.__stdout__에서 리디렉션 된 샷을 제공 할 수 있습니다. 코 또는 다른 플러그인이 출력을 캡처하는 것을 막을 수 있습니다. 이 객체는 프로그램의 시작 부분에 stdout의 원래 값을 포함합니다. in sys docs. 이것은 실행 프로세스가 이미 stdout 스트림을 파이썬 인터프리터의 스트림으로 리디렉션 한 경우에만 작동합니다.

하지만 별 차이가 없다고 생각합니다. 여기에서 핵심은 대부분의 경우 sys.stdout을 캡처하고 리디렉션하는 것이 subprocess() 함수 패밀리에 의해 실행되는 프로세스의 표준 I/O 스트림에는 영향을 미치지 않는다는 것입니다.

가장 좋은 방법은 명시 적으로 subprocess.PIPEcommunicate() (같은 here)를 사용하여 subprocess.Popen 전화에서 표준 출력을 캡처 테스트에서 그것을 밖으로 인쇄하고 코를 캡처 할 수 있도록하는 것입니다. subprocess 호출은 쉘을 통해 수행되고 python이 제어 할 수있는 stdout 외부에있을 가능성이 큽니다.

그리고이 코드를 변경할 수없는 경우, 당신은 항상 원숭이는 그것을 어떻게 예에 의존하기 때문에 당신은 아마, 실제로 외부 프로그램을 실행하는 기능에 대한 코드를 포함 할 필요가

+0

시도했지만 작동하지 않았습니다. 나는 당신이 "원숭이 경로 그것"에 의하여 정확하게 의미하는 무슨을 모른다. 그러나 나는 그 플러그인을 담당하는 사람들에게 연락을 취해 그 기능으로 출력을 포착하고 반환하도록 요청했다. – Amaranth

+0

플러그인 코드를 실제로 STDOUT을 캡처하는 다른 것으로 수정하는 것을 언급하고있었습니다. 그러나 제대로 수행 할 수있는 능력이있는 것처럼 보입니다. – Oleksiy

관련 문제