我得到结果后,我需要停止在python中通过Popen发出的服务(在另一个线程的后台运行),但是下面的方法失败了(为了解释,只使用ping
) :
class sample(threading.Thread):
def __init__(self, command, queue):
threading.Thread.__init__(self)
self.command = command;
self.queue = queue
def run(self):
result = Popen(self.command, shell=True, stdout=PIPE, stderr=STDOUT)
while True:
output = result.stdout.readline()
if not self.queue.empty():
result.kill()
break
if output != "":
print output
else:
break
def main():
q = Queue()
command = sample("ping 127.0.0.1", q)
command.start()
time.sleep(10)
q.put("stop!")
command.join()
if __name__ == "__main__":
main()
运行以上程序后,当我为ping
进行pgrep时,它仍然存在。如何杀死Popen打开的子进程?感谢。
PS:我也尝试过result.terminate(),但也没有真正解决问题。
答案 0 :(得分:3)
您真的不需要从线程运行子进程。尝试在没有线程的情况下运行子进程。此外,您指定了shell = True,因此它在shell中运行该命令。所以有两个新进程,shell和命令。你也可以通过使shell = False来删除shell。