【发布时间】:2017-07-22 01:32:41
【问题描述】:
如果需要定期检查正在运行的进程的stdout。例如,进程是tail -f /tmp/file,它是在python脚本中产生的。然后每 x 秒,该子进程的标准输出被写入一个字符串并进一步处理。子进程最终被脚本停止。
解析子进程的stdout,如果到目前为止使用check_output,这似乎不起作用,因为该进程仍在运行并且不会产生明确的输出。
>>> from subprocess import check_output
>>> out = check_output(["tail", "-f", "/tmp/file"])
#(waiting for tail to finish)
应该可以为子进程使用线程,以便可以处理多个子进程的输出(例如tail -f /tmp/file1,tail -f /tmp/file2)。
如何启动子进程、定期检查和处理其标准输出并最终以多线程友好的方式停止子进程? python脚本在Linux系统上运行。
目标不是连续读取文件,tail 命令就是一个示例,因为它的行为与实际使用的命令完全相同。
编辑:我没有想到这一点,该文件不存在。 check_output 现在只是等待进程完成。
edit2:另一种方法,Popen 和 PIPE 似乎会导致相同的问题。它等待tail 完成。
>>> from subprocess import Popen, PIPE, STDOUT
>>> cmd = 'tail -f /tmp/file'
>>> p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
>>> output = p.stdout.read()
#(waiting for tail to finish)
【问题讨论】:
-
stackoverflow.com/a/6482200/1866177 可能解决了这个问题。
-
您的示例存在比无法读取标准输出更大的问题。请修复它。
-
@Dschoni,OP 正在尝试摄取,而不是重定向输出。这使它比您提供的链接更完整。
-
您应该使用完整形式的
Popen,因为该进程将连续运行,锁定到标准输出管道并在文件对象上使用for循环(因为它是一个阻塞迭代器) .正如您所提到的,如果您的主程序除了响应文件中的更改之外还需要做一些事情,那么读取循环可能需要在单独的线程上运行。 -
当您通过实际尝试修复您的示例时,我将发布完整的答案。
标签: python multithreading python-3.x subprocess stdout