2016-07-27 8 views
3

Mit Python möchte ich zwei Teilprozesse parallel starten. Einer wird einen HTTP Server starten, während andere die Ausführung eines anderen Programms starten (das ist ein Python-Skript, das vom selen IDE-Plugin erzeugt wird, um Firefox zu öffnen, zu einer Webseite zu navigieren und einige Interaktionen zu machen). Auf der anderen Seite möchte ich die Ausführung des ersten Subprozesses (des HTTP-Servers) beenden, wenn der zweite Subprozess fertig ausgeführt ist.Parallele Ausführung von 2 separaten Python-Skripten mit Subprozess aus dem Haupt-Python-Skript

Die Logik meines Codes ist, dass das Selenium-Skript eine Website öffnet. Die Website führt automatisch einige GET-Aufrufe an meinen HTTP-Server durch. Nachdem das Selen-Skript beendet ist, soll der HTTP-Server geschlossen werden, damit alle erfassten Anfragen in einer Datei protokolliert werden können.

Hier ist mein Code:

class Myclass(object): 

HTTPSERVERPROCESS = "" 

    def startHTTPServer(self): 
     print "********HTTP Server started*********" 
     try: 
      self.HTTPSERVERPROCESS=subprocess.Popen('python CustomSimpleHTTPServer.py', \ 
          shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT) 
      self.HTTPSERVERPROCESS.communicate() 
     except Exception as e: 
      print "Exception captured while starting HTTP Server process: %s\n" % e 

    def startNavigatingFromBrowser(self): 
     print "********Opening firefox to start navigation*********" 
     try: 
      process=subprocess.Popen('python navigationScript.py', \ 
          shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
      process.communicate() 
      process.wait() 
     except Exception as e: 
      print "Exception captured starting Browser Navigation process : %s\n" % e 
     try: 
      if process.returncode==0: 
       print "HTTPSERVEPROCESS value: %s" % self.HTTPSERVERPROCESS.returncode 
       print self.HTTPSERVERPROCESS 
       self.HTTPSERVERPROCESS.kill() 
       #print "HTTPSERVEPROCESS value: %s" % self.HTTPSERVERPROCESS.returncode 
     except Exception as e: 
      print "Exception captured while killing HTTP Server process : %s\n" % e 

    def startCapture(self): 
     print "********Starting Parallel execution of Server initiation and firefox navigation script*********" 
     t1 = threading.Thread(target=self.startHTTPServer()) 
     t2 = threading.Thread(target=self.startNavigatingFromBrowser()) 
     t1.start() 
     t2.start() 
     t2.join() 

Hinweis: Die Ausführung beginnt mit startCapture() aufrufen

Das Problem ist, dass ich den obigen Code in meinem Terminal erhalten folgende

********Starting Parallel execution of HTTP Server initiation and firefox navigation script********* 
********HTTP Server started********* 
********Opening firefox to start navigation********* 


Process finished with exit code 0 
beim Fahren

Mein Programm beendet die Ausführung, auch wenn der für startNavigatingFromBrowser() gestartete Thread noch aktiv ist. Ich kann sehen, dass das Firefox durch die Website navigiert, selbst nachdem ich "Prozess beendet mit Exit-Code 0" für mein Programm bekommen habe. Aus diesem Grund bin ich nicht in der Lage zu erkennen, wann mein Browser die Ausführung des Browsers beendet hat ** (Dies ist notwendig, weil ich process.returncode vom navigationScript-Subprozess verwende, um meinen HTTP-Server-Prozess zu beenden) **.

Welche Änderungen sollte ich an dem Code vornehmen, damit ich feststellen kann, wann der Selenavigations-Subprozess beendet ist, sodass ich meinen HTTP-Server stoppen kann?

+0

Glück gehabt? Ich replizierte die Struktur mit dem Aufruf wait(), und es funktioniert für mich. –

Antwort

1

Rufen Sie t2.join() bevor Sie Ihr Programm beenden. Dies wartet darauf, dass der Navigations-Thread beendet wird, bevor die Ausführung fortgesetzt wird.

Edit:

Ihr Navigations Thread sofort beendet, weil Sie nicht für das Kind Prozess warten zu beenden. Dies sollte das Problem lösen:

process=subprocess.Popen('python navigationScript.py', \ 
         shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
process.wait() 

Dies wird den Thread anhalten, bis der Subprozess abgeschlossen ist.

+0

Haben Sie meinen obigen Code mit Ihrem Vorschlag aktualisiert. Aber auch nach dem Hinzufügen von t2.join() ist das Ergebnis dasselbe. –

+0

siehe aktualisierten Beitrag. –

+0

ja .... Das löst das Problem. Danke –

Verwandte Themen