【发布时间】:2016-12-08 04:25:08
【问题描述】:
使用 python,我正在并行启动两个子进程。一个是 HTTP 服务器,另一个是另一个程序的执行(CustomSimpleHTTPServer.py,这是一个由 selenium IDE 插件生成的 python 脚本,用于打开 firefox、导航到网站并进行一些交互)。另一方面,我想在第二个子进程执行完毕后停止第一个子进程(HTTP Server)的执行。
我的代码逻辑是 selenium 脚本会打开一个网站。该网站会自动对我的 HTTP 服务器进行一些 GET 调用。 selenium 脚本执行完成后,应该关闭 HTTP 服务器,以便将所有捕获的请求记录在一个文件中。
这是我的主要 Python 代码:
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)
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()
#self.HTTPSERVERPROCESS.terminate()
#self.kill(self.HTTPSERVERPROCESS.pid)
except Exception as e:
print "Exception captured while killing HTTP Server process : %s\n" % e
def kill(self,proc_pid):
process = psutil.Process(proc_pid)
for proc in process.get_children(recursive=True):
proc.kill()
process.kill()
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() 开始执行
这是 CustomSimpleHTTPServer.py 的代码,它应该在终止时将捕获的请求写入 logfile.txt:
import SimpleHTTPServer
import SocketServer
PORT = 5555
class MyHTTPHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
log_file = open('logfile.txt', 'w')
def log_message(self, format, *args):
self.log_file.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
Handler = MyHTTPHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()
当我使用 self.HTTPSERVERPROCESS.kill() 或 self.HTTPSERVERPROCESS.terminate() 或 os.kill() 时,我会在运行主要 Python 代码时在终端中得到关注
********Starting Parallel execution of Server initiation and firefox navigation script*********
********SimpleHTTPServer started*********
********Opening firefox to start navigation*********
HTTPSERVEPROCESS value: <subprocess.Popen object at 0x1080f8410>
2459
Exception captured while killing HTTP Server process : [Errno 3] No such process
Process finished with exit code 0
当我使用 self.kill(self.HTTPSERVERPROCESS.pid) 时,我会在运行主要 Python 代码时在终端中得到关注
********Starting Parallel execution of Server initiation and firefox navigation script*********
********SimpleHTTPServer started*********
********Opening firefox to start navigation*********
HTTPSERVEPROCESS value: <subprocess.Popen object at 0x1080f8410>
2459
Exception captured while killing HTTP Server process : 'Process' object has no attribute 'get_children'
Process finished with exit code 0
以下3个都不能杀死HTTPServer进程:
self.HTTPSERVERPROCESS.kill()
self.HTTPSERVERPROCESS.terminate()
self.kill(self.HTTPSERVERPROCESS.pid)
我知道 CustomSimpleHTTPServer.py 是正确的,因为当我单独运行它并手动浏览到网站,然后通过在终端中按 CTRL-c 手动终止 CustomSimpleHTTPServer.py 脚本时,日志将填充到 logfle.txt 中。
我对我的代码进行了哪些更改以使其正常工作并填充日志?
【问题讨论】:
-
你为什么用
stdout=subprocess.PIPE和stderr=subprocess.PIPE启动你的CustomHTTPServer?这会迫使您阅读输出。我只是将它们重定向到 /dev/null 或文件。 -
我应该只实现 "" self.HTTPSERVERPROCESS=subprocess.Popen('python CustomSimpleHTTPServer.py',shell=True) "" 吗?
-
好的 - 我看到您的自定义服务器设置了一个日志文件,所以实际上它可能不会生成任何输出。
标签: python multithreading selenium