2016-07-27 34 views
3

使用python,我想要并行启动两个子进程。一个将启动一个HTTP服务器,而其他将开始另一个程序(这是由硒IDE插件生成打开Firefox,浏览到一个网站,做一些互动python脚本)的执行。另一方面,当第二个子进程完成执行时,我想停止执行第一个子进程(HTTP Server)。使用主Python脚本中的子进程并行执行2个独立的Python脚本

我的代码的逻辑是,硒脚本将打开一个网站。该网站将自动对我的HTTP服务器进行几次GET调用。在selenium脚本完成执行后,应该关闭HTTP Server,以便它可以将所有捕获的请求记录在文件中。

这里是我的代码:

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() 

注:开始执行调用startCapture()

的问题是,我得到我的终端在运行上面的代码

********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 
以下

我的程序执行完毕即使线程开始为startNavigatingFromBrowser()仍然有效。即使在我的程序中出现“处理完成退出代码0”后,我仍然可以看到Firefox浏览了网站。由于这个我不能在我的浏览器导航线程执行完毕**检测(这是必要的,因为我使用process.returncode从navigationScript子回​​到杀了我的HTTP Server进程)**。

我应该做的代码什么样的变化,这样,当硒导航子进程执行完毕,这样我可以阻止我的HTTP服务器,我可以成功检测?

+0

现在好运吗?我用wait()调用复制了结构,它适用于我。 –

回答

1

在退出程序之前致电t2.join()。这将等待导航线程终止,然后继续执行。

编辑:

您的导航线程立即终止,因为你不等待子进程退出。这应该解决问题:

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

这将暂停该线程,直到子进程完成。

+0

已经用你的建议更新了我的代码。但即使添加了t2.join(),结果也是一样的。 –

+0

查看更新的帖子。 –

+0

是的....这解决了这个问题。谢谢 –

相关问题