使用主Python脚本中的子进程并行执行2个单独的python脚本

时间:2016-07-27 11:09:50

标签: python selenium python-multithreading

使用python,我想并行启动两个子进程。一个将启动一个HTTP服务器,而另一个将开始执行另一个程序(这是一个由selenium IDE插件生成的python脚本,用于打开firefox,导航到一个网站并进行一些交互)。另一方面,我想在第二个子进程完成执行时停止执行第一个子进程(HTTP Server)。

我的代码的逻辑是selenium脚本将打开一个网站。该网站将自动对我的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()启动的线程仍处于活动状态,我的程序也会完成执行。我可以看到firefox正在浏览网站,即使在我的程序中获得“Process finished with exit code 0”之后。由于这个原因,我无法检测到我的浏览器导航线程何时完成执行**(这是必要的,因为我使用从navigationScript子进程返回的process.returncode来终止我的HTTP服务器进程)**。

我应该对代码进行哪些更改,以便我能够成功检测到selenium导航子流程何时完成执行,以便我可以停止我的HTTP服务器?

1 个答案:

答案 0 :(得分:1)

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

编辑:

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

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

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