2014-05-15 3 views
7

subprocess.Popen()을 사용하여 스크립트를 호출하는 응용 프로그램을 테스트하려면 nose을 사용하고 있습니다. capture 또는 logcapture 플러그인은이 스크립트의 출력을 캡처하지 않는 것 같습니다. 이 출력물을 코에 파이프하는 쉬운 방법이 있습니까?subprocess.Popen() with nose의 출력 캡처

여기 제가 지금까지 시도한 바 있습니다. 주의 "저를 캡처"캡처되지 않습니다

example.py :

if __name__ == '__main__': 
    print 'Capture me' 

test.py :

import subprocess 
import sys 


def test_popen(): 
    # nose's capture plugin replaces sys.stdout with a StringIO instance. 
    # subprocess.Popen() expects stdout to have a fileno property, which 
    # StringIO doesn't, so fake it. 
    sys.stdout.fileno = lambda: 1 

    subprocess.Popen(['python', 'example.py'], stdout=sys.stdout) 
    assert False # Force test to fail so we see nose output 

출력 :

$ nosetests test.py 
F 
====================================================================== 
FAIL: test.test_popen 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/pmdarrow/Envs/example/lib/python2.7/site-packages/nose/case.py", line 197, in runTest 
    self.test(*self.arg) 
    File "/Users/pmdarrow/Code/example/API/test.py", line 8, in test_popen 
    assert False 
AssertionError 

---------------------------------------------------------------------- 
Ran 1 test in 0.004s 

FAILED (failures=1) 
Capture me 
+0

왜'stdout' 매개 변수를'sys.stdout'에 보내는 이유는 무엇입니까? 당신은없이 시도 했습니까? – Wolph

+0

'Popen()'이 출력물을 코에 보내도록하려는 시도였습니다. 그것없이 출력은 똑같습니다. – pmdarrow

+0

출력을 찾고 있다면,'subprocess.check_output()'을 시도하십시오. –

답변

0

당신은 고려해 볼 수 있습니다 :

p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE) 
q = p.communicate() 
output = q[0] 

는 하위 프로세스에서 더 많은 정보를 원하시면 communicate를 참조하십시오. 건배!

+0

이것이 내 문제를 해결하는지 잘 모르겠습니다. 스크립트에서 출력물을 캡처하는 방법을 묻지 않고, 출력 결과를 캡처하여 테스트 결과에 멋지게 표시하는 방법을 묻습니다. – pmdarrow

+0

통신과 함께 사용하면 테스트에서 사용할 수 있습니다. 그러면 코로 원하는대로 할 수 있습니다. 미안해, 더 이상 도와 줄 수 없다. 나는 코를 전문적으로 다루지 않는다 ... : (하지만 너는 시험을 통과해야한다. 건배! – abrunet

+0

답을 고맙지 만 코를 찾고있다. – pmdarrow

3

알고 있어야하는 몇 가지 문제점이 있습니다. 나는 @ arbunet 대답을 반복하고 있을지 모르지만, 나에게 조금만 노출해라. 여기

import subprocess 
import sys 

def test_popen(): 
    p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE) 
    out, err = p.communicate() 
    print out 

    assert False 

을 PIPE 인쇄 문을 사용하여 표준 출력으로 작성 리디렉션됩니다 : 당신이 테스트의 표준 출력을 표준 출력 '과정을 마칠 때까지 기다리 및 프로세스를 재한다면, 모든 것이 코 제대로 캡처됩니다. 또는 sys.__stdout__ (테스트의 unmolested stdout) 또는 다른 파일 설명자를 Popen 호출에 전달한 다음 나중에 sys.stdout (nose로 만든 StringIO.StringIO 인스턴스)으로 플러시 할 수 있지만 단순한 것 print 문).

+0

통신을 사용하면 작동하지 않습니다. * 읽는 스레드를 * p.stdout에서 * sys.stdout * 그렇지 않으면 캡처 된 로그는 모두 "마지막 테스트"와 연관되어 표시되지 않습니다. –