2014-05-15 16 views
7

Ich verwende nose, um eine Anwendung zu testen, die subprocess.Popen() verwendet, um ein Skript aufzurufen. Weder das capture noch logcapture Plugin scheint die Ausgabe dieses Skripts zu erfassen. Gibt es eine einfache Möglichkeit, diesen Ausgang in die Nase zu leiten?Erfassen der Ausgabe von subprocess.Popen() mit Nase

Hier ist, was ich bisher versucht habe; beachten Sie "Capture me" nicht erfasst:

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 

Ausgang:

$ 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

Warum der benutzerdefinierte 'stdout' Parameter, wenn Sie ihn trotzdem an' sys.stdout 'senden? Hast du ohne versucht? – Wolph

+0

Es war nur ein Versuch, 'Popen()' zu zwingen, seine Ausgabe an Nase zu senden. Die Ausgabe ist ohne sie identisch. – pmdarrow

+0

Alternativ, wenn Sie für die Ausgabe suchen, versuchen Sie 'subprocess.check_output()' –

Antwort

0

Sie sollten erwägen:

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

communicate von subprocess für weitere Informationen anzeigen. Prost!

+0

Ich bin mir nicht sicher, dass das mein Problem löst. Ich frage nicht, wie ich die Ausgabe eines Skripts erfassen soll, ich frage, wie man diese Ausgabe erfassen und in den Testergebnissen schön darstellen kann. – pmdarrow

+0

bekommen es mit kommunizieren können Sie es in Ihrem Test verwenden. Dann können Sie mit der Nase machen, was Sie wollen. Es tut mir leid, ich kann nicht mehr helfen, ich bin kein Experte mit Nase ... :(Aber es sollte Ihnen ermöglichen, Ihren Test bestanden zu haben! Prost! – abrunet

+0

Danke für die Antwort, aber ich bin auf der Suche nach einer Nase – pmdarrow

3

Es gibt einige Probleme, die Sie beachten müssen. Ich wiederhole vielleicht @arbunet Antwort, aber mit mir ein wenig hier. Also, wenn Sie den Prozess warten zu beenden, und leiten Prozess stdout an den stdout-Test, wird alles richtig mit Nase erfaßt werden:

import subprocess 
import sys 

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

    assert False 

Hier ist die PIPE erstellt und weitergeleitet in stdout Druck Anweisung. Alternativ könnten Sie sys.__stdout__ (unbelasteter stdout des Tests) oder einen anderen Dateideskriptor an den Popen-Aufruf übergeben und später in sys.stdout (StringIO.StringIO-Instanz von nose) leeren, aber es sieht weniger sauber aus (im Vergleich zu einem einfachen Druckanweisung).

+0

Die Verwendung von Kommunikation wird nicht ganz funktionieren.Sie müssen einen Thread, * liest * von der p.stdout spawnen und schreibt in * sys.stdout * Andernfalls werden die erfassten Protokolle alle dem "letzten Test" zugeordnet und nicht angezeigt. –

Verwandte Themen