【问题标题】:Check if subprocess is still running while reading its output line by line [duplicate]在逐行读取其输出时检查子进程是否仍在运行[重复]
【发布时间】:2016-06-21 16:24:09
【问题描述】:

我正在 Python 中启动 subprocess 并尝试读取每一行输出。不幸的是,如果我的流程仍然存在,我找不到测试的好方法。标准方法似乎是检查poll(),但这似乎总是返回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) 总是返回。

我做错了什么?

【问题讨论】:

  • 您打开了通往进程标准输入的管道。是在等待读取数据吗?
  • 否进程只输出数据。将来我想增加对两个方向的支持,这就是为什么我在那里。

标签: python process subprocess stdin


【解决方案1】:

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

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() 等待终止,而不是立即终止进程。

【讨论】:

  • 这似乎有效。谢谢。
  • @KrisHarper:如果要逐行捕获其输出,则无需检查进程是否处于活动状态。
  • @J.F.Sebastian 嗯,所以在您的 Python 3 答案中,stackoverflow.com/a/17698359/817630,当行仍在发送到标准输出时,进程没有结束的风险吗?在我使用这个答案stackoverflow.com/a/2716032/817630 来回答同一个问题之前,但我现在看到它推荐了你的答案。
  • @KrisHarper 如果进程死了,那么(显然)它不会产生任何输出,并且——一旦读取了已经缓冲的数据——循环就会结束。
猜你喜欢
  • 2011-03-07
  • 1970-01-01
  • 2015-02-19
  • 2017-06-10
  • 2011-02-17
  • 2017-09-02
相关资源
最近更新 更多