在逐行读取其输出时检查子进程是否仍为 运行

Check if subprocess is still running while reading its output line by line

我在 Python 中开始 subprocess 并尝试读取每一行输出。不幸的是,如果我的流程还活着,我找不到好的测试方法。标准方法似乎是检查 poll(),但似乎总是 return None。这是我的代码。

proc = Popen(sys.argv[1:], stdin=PIPE, stdout=PIPE, stderr=STDOUT)

while True:
    process_line(proc.stdout.readline().decode('utf-8'))

    if not proc.poll():
        break

for line in proc.communicate()[0].splitlines():
    process_line(line.decode('utf-8'))

我也尝试过使用 os.kill(proc.pid, 0),它适用于非派生进程,但似乎 Python 控制它启动的进程,所以 os.kill(proc.pid, 0) 总是 returns.

我做错了什么?

要逐行处理子进程输出,试试这个:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1)
while p.poll() is None:
    line = p.stdout.readline()
    ...do something with the line here

注意我将缓冲区大小设置为 1。

另外,不需要os.kill(proc.pid, 0)。只需打电话 .kill() 在您生成的子进程上。您也可以调用 .wait() 等待终止,而不是立即终止进程。