2014-05-15 13 views
7

Używam nose do testowania aplikacji używającej subprocess.Popen() do wywoływania skryptu. Ani wtyczka capture ani logcapture nie wydają się przechwytywać wyjścia tego skryptu. Czy istnieje prosty sposób na wyprowadzenie tego wyjścia do nosa?Przechwytywanie danych wyjściowych podprocesu.Popen() z nosem

Oto, co próbowałem do tej pory; Uwaga: "Uchwyć mnie" nie jest zrobione:

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 

wyjście:

$ 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

Dlaczego niestandardowy parametr 'stdout', jeśli wysyłasz go do' sys.stdout'? Czy próbowałeś bez? – Wolph

+0

To była tylko próba zmuszenia 'Popen()' do wysyłania swoich wyników do nosa. Dane wyjściowe są bez niego takie same. – pmdarrow

+0

Alternatywnie, jeśli szukasz wyjścia, spróbuj 'subprocess.check_output()' –

Odpowiedz

0

Można rozważyć:

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

Zobacz communicate uzyskać więcej informacji od podproces. Twoje zdrowie!

+0

Nie jestem pewien, czy to rozwiąże mój problem. Nie pytam, jak uchwycić wynik ze skryptu, pytam, jak uzyskać nosa, aby uchwycić ten wynik i wyświetlić go ładnie w wynikach testu. – pmdarrow

+0

otrzymanie go za pomocą komunikatora umożliwi korzystanie z niego w teście. Wtedy możesz robić, co chcesz, z nosem. Przepraszam, że nie mogę więcej pomóc, nie jestem ekspertem od nosa ... :(Ale to powinno umożliwić tobie przejście testu! Wiwaty! – abrunet

+0

Dzięki za odpowiedź, ale szukam nosa specyficzne rozwiązanie: – pmdarrow

3

Jest kilka kwestii, o których musisz pamiętać. Mogę powtarzać odpowiedź @arbunet, ale trochę mnie tu przyłóż. Jeśli więc czekać na proces do końca, a proces przekierowywania stdout do stdout w testowej, wszystko będzie zrobione właściwie z nosa:

import subprocess 
import sys 

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

    assert False 

Tutaj rura jest tworzona i przekierowany na stdout za pomocą instrukcji print. Alternatywnie, możesz przekazać sys.__stdout__ (niezmienione standardowe wyjście testu) lub inny deskryptor pliku do wywołania Popen, a następnie przepłukać go do sys.stdout (instancja StringIO.StringIO stworzona przez nos), ale wygląda na mniej czystą (w porównaniu do prostego print statement).

+0

Używanie komendy nie będzie działało.Należy utworzyć wątek, który * czyta * z p.stdout i zapisuje do * sys.stdout * W przeciwnym razie przechwycone logi będą skojarzone z "ostatnim testem" i nie będą wyświetlane. –

Powiązane problemy