Seite 1 von 1

[gelöst] Unittest-Ausgaben in Variable speichern?

Verfasst: Dienstag 16. August 2005, 13:08
von dusselmann
Hi @all,

kann ich die Ausgaben, die bei der Durchführung eines Unittests ausgegeben werden (in der Konsole), in eine Variable umleiten? Bzw. auf den normalen Sysout?

Ich rufe Unittests aus einem 2 Programm heraus auf (als UNIX-Kommando "python unixtest.py") und speichere das, was in den normalen Sysout geschrieben wird in einer Variablen zur weiteren Verarbeitung. Allerdings komme ich dadurch nicht an diese Unittest-Ausgaben... :cry:

Kann mir jemand helfen, bzw. einen Tipp geben?

Viele Grüße, Dussel

Verfasst: Dienstag 16. August 2005, 15:05
von Leonidas
Ich habe das Thema verschoben, da es nicht ersichtlich war, was es mit GTK oder GNOME zu tun hatte.

Versuch mal auch stderr mitzuspeichern, es kann gut sein, dass unittests auch dort ausgegeben werden.

Verfasst: Dienstag 16. August 2005, 15:10
von dusselmann
huch.. stimmt. Schreib ne GTK-Anwendung ;)
Leonidas hat geschrieben:Versuch mal auch stderr mitzuspeichern, es kann gut sein, dass unittests auch dort ausgegeben werden.
genau da weiß ich nicht wie... Der Aufruf funktioniert wie folgt (genaue Syntax hab ich jetzt nicht im Kopf):

variable = konsolenaufruf("python unittest.py")

Wie kann ich dann stderr mitspeichern?

Verfasst: Dienstag 16. August 2005, 17:45
von Leonidas
Ob bei deinem Programm GTK oder Qt verwendet wird ist bei diesem problem völlig egal.

Das Problem ist jedoch einfach mit dem Modul subprocess zu lösen.

Code: Alles auswählen

from subprocess import Popen, PIPE

cmd = 'python test_wasauchimmer.py'

p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)

unittest_output = p.stderr.read()
returncode = p.wait()

print returncode
print unittest_output
Ja, unittest gibt tatsächlich auf stderr aus.. das wusste ich noch nicht, aber wenn man überlegt, macht das sogar wirklich Sinn.

Verfasst: Dienstag 16. August 2005, 19:53
von dusselmann
Das ist ja cool. Danke dir!

Hab das mal in mein Programm gebastelt:

Code: Alles auswählen

        for file in self.__toggle:
            cmd = 'python ' + file
            p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
            unittest_output = p.stderr.read()
            returncode = p.wait()
            self.__controller.insert_text(unittest_output + '  ' + returncode)
folgende Fehlermeldung:

Code: Alles auswählen

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.4/threading.py", line 442, in __bootstrap
    self.run()
  File "/home/dusselmann/development/Programme/Workspace/PythonProjekt/UnittestChooser/UnittestChooser.py", line 213, in run
    p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
  File "/usr/lib/python2.4/subprocess.py", line 558, in __init__
    errread, errwrite)
  File "/usr/lib/python2.4/subprocess.py", line 991, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
Woran kann das liegen? Hab ich das Modul subprocess nicht?

Gruß, Dussel

Verfasst: Dienstag 16. August 2005, 20:02
von Leonidas
dusselmann hat geschrieben:Woran kann das liegen? Hab ich das Modul subprocess nicht?
Doch, das hast du (in /usr/lib/python2.4/subprocess.py). Und mein simples Beispiel funktioniert bei dir?

Verfasst: Dienstag 16. August 2005, 20:06
von dusselmann
gleiche meldung...

Verfasst: Dienstag 16. August 2005, 20:46
von Leonidas
Hmm, das sollte eigentlich nicht sein, aber gut, auf ein neues:

Code: Alles auswählen

import popen2

cmd = 'python test_wasauchimmer.py'
child_outstream, child_stdin = popen2.popen4(cmd)

unittest_output = child_outstream.read()
print unittest_output

Verfasst: Dienstag 16. August 2005, 20:50
von dusselmann
WOW!!! Vielen Dank! Du hast mir sehr geholfen!!!

:D Jetzt hat es funktioniert

Verfasst: Mittwoch 17. August 2005, 06:43
von jens
Probiere es doch nochmal so:

Code: Alles auswählen

import subprocess

cmd = 'python test_wasauchimmer.py' 
process = subprocess.Popen(
        cmd,
        # cwd     = ".", # Verzeichnis indem losgelegt werden soll
        shell   = True,
        stdout  = subprocess.PIPE,
        stderr  = subprocess.STDOUT
    )

print process.stdout.read()
So werden die Ausgaben auf stderr nach stdout umgeleitet. Somit erhält man beides zusammen...
Evtl. kann man auch das CurrentWoringDir angeben, halt das start Verzeichniss.