后台的子进程模块?

时间:2017-09-07 20:00:53

标签: python subprocess

Python中的子进程模块是否仍在后台运行,而您仍然可以继续使用该程序?

例如:如果我去" tail -f * .log"作为一个子进程,我将这些行读入Python,我仍然能够与" tail"同时执行其他任务。过程发生了什么?或者更多的是多线程?

1 个答案:

答案 0 :(得分:0)

subprocess.check_output将等待子进程终止,然后才会给出它的输出。

subprocess.Popen做你想要的。它看起来像这样:

proc = subprocess.Popen(['/usr/bin/tail', '-f', '*.log'], stdout=subprocess.PIPE, shell=True)

您需要shell = True,以便解释* .log中的通配符。如果不是这样,你就不需要shell了。小心地将参数传递给Popen,shell = True;如果参数是用户提供的,这可能会带来安全风险。找到一种不需要shell的方法通常会更好。在你的情况下,这很简单 - 你只需要使用python构建日志文件列表,然后将列表元素作为进一步的参数传递。

stdout = subprocess.PIPE在这里,以便您可以读取尾部的输出。您可以通过proc.stdout访问它,并从常规文件中读取它。

但是阅读它可能会有点棘手,因为你必须定期做这件事以确保管道的缓冲区不会填满并阻止尾部进程。一种方法是启动一个线程,它不会将尾部的输出读入足够大的缓冲区。