2016-06-19 3 views
2

Ich habe Schwierigkeiten, ein Python-Skript zu erhalten, um einen Subprozess zu starten, warten, bis es abgeschlossen ist und dann die erforderlichen Daten abrufen. Ich bin ziemlich neu in Python.Starten Sie einen Subprozess, warten Sie auf den Abschluss und dann Daten in Python

Der Befehl, den ich als Unterprozess ausführen möchten ist

./bin.testing/Eva -t --suite="temp0" 

diesen Befehl von Hand in das Terminal Linux laufen produziert:

in terminal mode 
    Evaluation error = 16.7934 

ich den Befehl als Python Unter ausführen möchten verarbeiten und die Ausgabe zurück erhalten. Aber alles, was ich versuche, die zweite Zeile zu überspringen scheint (. Letztlich ist es die zweite Zeile, die ich will) Im Moment habe ich dies:

def job(self,fen_file): 
     from subprocess import Popen, PIPE 
     from sys import exit 

     try: 
      eva=Popen('{0}/Eva -t --suite"{0}"'.format(self.exedir,fen_file),shell=True,stdout=PIPE,stderr=PIPE)    
      stdout,stderr=eva.communicate() 
     except: 
      print ('Error running test suite '+fen_file) 
      exit("Stopping") 

     print(stdout) 
     . 
     . 
     . 
     return 0 

All dies zu produzieren scheint, ist

in terminal mode 

    0 

mit der wichtigen Zeile fehlt. Die print-Anweisung ist nur, damit ich sehen kann, was ich aus dem Unterprozess zurückerhalte - die Absicht ist, dass es durch Code ersetzt wird, der die Nummer aus der zweiten Zeile verarbeitet und die Ausgabe zurückgibt (hier komme ich gerade zurück) 0, damit ich dieses spezielle Bit zuerst zur Arbeit bringen kann: Der Aufrufer dieser Funktion gibt das Ergebnis aus, weshalb am Ende der Ausgabe eine Null steht. Exedir ist nur das Verzeichnis der ausführbaren Datei für den Unterprozess und fen-file ist nur eine ASCII-Datei, die der Unterprozess benötigt. Ich habe versucht, den "im Terminal-Modus" aus dem Quellcode des Unterprozesses zu entfernen und kompilieren, aber das funktioniert nicht - es gibt immer noch nicht die wichtige zweite Zeile.

Vielen Dank im Voraus; Ich vermute, was ich falsch mache, ist wirklich sehr einfach.

Edit: Ich sollte hinzufügen, dass der Subprozess Eva kann eine Sekunde oder zwei zu vervollständigen.

Antwort

2

Da die zweite Zeile eine Fehlermeldung ist, ist es wahrscheinlich in Ihrer stderr Variable gespeichert!

Um zu wissen, für sicher, dass Sie Ihre stderr in Ihrem Code drucken können, oder Sie können das Programm auf der Kommandozeile und sehen laufen, wenn die Ausgabe in stdout und stderr aufgeteilt wird. Ein einfacher Weg ist ./bin.testing/Eva -t --suite="temp0" > /dev/null zu tun. Alle Nachrichten, die Sie erhalten, sind stderr, da stdout zu /dev/null umgeleitet wird.

Auch normalerweise mit Popen die shell=True Option wird abgeraten, es sei denn, wirklich benötigt. Statt eine Liste übergeben:

[os.path.join(self.exedir, 'Eva'), '-t', '--suite=' + fen_file], shell=False, ... 

Diese Probleme auf der ganzen Linie vermeiden können, wenn eines Ihrer Argumente würden normalerweise von der Shell interpretiert werden. (Anmerkung, ich entfernte die "" 's, weil die Schale normalerweise jene für Sie essen würde!)

+0

Hallo, vielleicht die ‚Bewertung Fehler‘ irreführend ist, aber es ist nicht eine Fehlermeldung: es ist der Ausgang des Teilprozesses erwünscht ist, ist die die quadrierte Differenz zwischen einer berechneten und einer gemessenen Menge wird eine Berechnung. Übergeben Sie eine Liste, entfernen Sie die Shell = true und entfernen Sie die doppelten Anführungszeichen, wie Sie es vorgeschlagen haben.Vielen Dank! – ppyvabw

+0

@ppyvabw Weißt du, es könnte die '" -Suite "{0}" 'sein - ich habe nicht erwähnt, dass du das' = 'verpasst hast, aber es in meiner Version enthalten! – rrauenza

0

Versuchen Sie, Unterprozeß check_output.

output_lines = subprocess.check_output(['./bin.testing/Eva', '-t', '--suite="temp0"']) 
for line in output_lines.splitlines(): 
    print(line)