子进程输出满足条件时杀死子进程?

时间:2019-01-10 08:19:15

标签: python subprocess

如果子进程的输出符合条件,我希望Python终止该进程

例如,这是一个无限循环while_file.py,它输出0到999,然后看起来没有响应。

i = 0
while 1:
    if i < 1000:
        print i
    i += 1

我想检查子进程的输出是否为999,然后将其杀死。

import os
import signal
import subprocess

def run_cmd(cmd):
    pro = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True, preexec_fn=os.setsid)
    while True:
        r = pro.stdout.read()
        print r
        if r == 999:
            os.killpg(os.getpgid(pro.pid), signal.SIGTERM)

if __name__=='__main__':
    print run_cmd('python while_file.py')

但是似乎没有任何回应...为什么?被阻止了吗?

2 个答案:

答案 0 :(得分:1)

有两个问题:

  • “读取”功能(来自pro.stoud.read)读取整个文件(直到EOF)。在您的情况下,这不会起作用,因为stdout永远不会关闭,这意味着没有EOF。您应该使用readline
  • 在阅读时,您正在阅读的是字符串而不是数字(因此,应将“ 999”而不是999进行比较)
  • 我建议确保没有缓冲(如果某些东西留在缓冲中,以后可能会令人讨厌)

更改的代码:

import sys

i = 0
while True:
    if i < 1000:
        print i
        sys.stdout.flush()
    i += 1

import os
import signal
import subprocess

def run_cmd(cmd):
    pro = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                           shell=True, preexec_fn=os.setsid)
    while True:
        r = pro.stdout.readline()
        r = r.strip()
        print(r)
        if r == "999":
            os.killpg(os.getpgid(pro.pid), signal.SIGTERM)
            print("Process killed")
            break

if __name__=='__main__':
    print run_cmd('PYTHONUNBUFFERED=1; python a.py')

答案 1 :(得分:0)

我不知道这是否是个好主意,但这是您可以实现的一种方法:

  

while_file.py

i = 0
while 1:
    if i < 1000:
        print(i)
        i += 1
  

stackoverflow.py

import os
import signal
import subprocess

def run_cmd(cmd):
    pro = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
    for line in iter(pro.stdout.readline, ''):
        r = line.rstrip()
        print(r)
        if r == b'999':
            os.killpg(os.getpgid(pro.pid), signal.SIGTERM)
            print("True !")

if __name__ == '__main__':
    print(run_cmd('python while_file.py'))