【问题标题】:Parallel execution of 2 separate Python scripts using subprocess from the main Python script使用主 Python 脚本中的子进程并行执行 2 个单独的 Python 脚本
【发布时间】:2016-07-27 11:09:50
【问题描述】:

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

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

这是我的代码:

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 正在浏览网站,即使在我为我的程序获得“进程完成,退出代码 0”后也是如此。因此,我无法检测到我的浏览器导航线程何时完成执行。 (这是必要的,因为我正在使用从 navigationScript 子进程返回的 process.returncode 来杀死我的 HTTP 服务器进程)

我应该对代码进行哪些更改,以便成功检测 Selenium 导航子进程何时完成执行,从而停止我的 HTTP 服务器?

【问题讨论】:

  • 现在运气好吗?我用 wait() 调用复制了这个结构,它对我有用。

标签: python selenium subprocess


【解决方案1】:

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

编辑:

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

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

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

【讨论】:

  • 已根据您的建议更新了我上面的代码。但是即使加上t2.join(),结果也是一样的。
  • 已根据您的建议更新了我的代码。但是我现在遇到了另一个问题。当执行点到达 self.HTTPSERVERPROCESS.kill()
  • 在这里为这个问题创建了一个新线程:stackoverflow.com/questions/38726804/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2021-12-19
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多