1

在我得到结果后,我需要停止我在 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()

运行上述程序后,当我 pgrep for 时ping,它仍然存在。如何杀死 Popen 打开的子进程?谢谢。

PS:我也试过result.terminate(),但也没有真正解决问题。

4

1 回答 1

3

您实际上并不需要从线程运行子进程。尝试在没有线程的情况下运行子进程。此外,您指定了 shell=True,因此它在 shell 中运行命令。因此有两个新进程,shell 和命令。您也可以通过设置 shell=False 来移除 shell。

于 2012-04-09T21:06:06.727 回答