gpt4 book ai didi

python - 无法使用 process.kill() 或 process.terminate() 或 os.kill() 或使用 psutil 终止 Python 子进程

转载 作者:行者123 更新时间:2023-12-03 13:17:06 28 4
gpt4 key购买 nike

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

我的代码逻辑是 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 中。

我应该对我的代码进行哪些更改才能使其正常工作并填充日志?

最佳答案

你应该只使用 os.kill() 来通知进程:

import os
import signal
...
os.kill(the_pid, signal.SIGTERM) # usually kills processes
os.kill(the_pid, signal.SIGKILL) # should always kill a process

此外,如果您杀死父进程,它通常也会杀死子进程。

更新:

我对服务器程序做了两个小改动:

  • 添加对 self.log_file.flush() 的调用以确保日志条目被刷新到日志文件。
  • 重写 allow_reuse_address 以便您可以重用终止服务器后不久的相同地址。(参见 this SO question)

文件服务器:

#!/usr/bin/env python

import SimpleHTTPServer
import SocketServer
PORT = 5555

class MyServer(SocketServer.TCPServer):
allow_reuse_address = True

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))
self.log_file.flush()

Handler = MyHTTPHandler
httpd = MyServer(("", PORT), Handler)
httpd.serve_forever()

这是一个简单的导航程序(文件 Navigate):

#!/usr/bin/env python

import requests
import time

URL = "http://localhost:5555/"

def main():
for x in range(5):
print "x =", x
r = requests.get(URL + "asd")
time.sleep(1)
print "Quitting"

main()

这是主程序:

#!/usr/bin/env python

import os
import subprocess
import signal

def main():
# start web server
web = subprocess.Popen(["./Server"])
print "web server pid:", web.pid

# start navigator
nav = subprocess.Popen(["./Navigate"])
print "nav pid: ", nav.pid

# wait for nav to exit
nav.wait()
print "done waiting for nav"
print "killing web server"
os.kill(web.pid, signal.SIGTERM )
web.wait()
print "server terminated"

main()

关于python - 无法使用 process.kill() 或 process.terminate() 或 os.kill() 或使用 psutil 终止 Python 子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38726804/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com