【问题标题】:Subprocess Module in background?后台子进程模块?
【发布时间】:2018-02-16 15:43:48
【问题描述】:

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

例如:如果我将“tail -f *.log”作为子进程并将这些行读入 Python,我是否仍然能够在“tail”进程发生的同时执行其他任务?或者这更像是一个多线程?

【问题讨论】:

标签: python subprocess


【解决方案1】:

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

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

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

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

stdout=subprocess.PIPE 在这里,以便您可以读取 tail 的输出。您可以通过proc.stdout 访问它并像从普通文件中一样读取它。

但是从中读取可能会有些棘手,因为您必须定期执行此操作以确保管道的缓冲区不会填满并阻塞尾部进程。一种方法是启动一个线程,该线程除了将 tail 的输出读取到足够大的缓冲区之外什么都不做。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2017-08-11
    相关资源
    最近更新 更多