【问题标题】:subprocess not returning until command complete子进程在命令完成之前不返回
【发布时间】:2015-11-20 15:56:22
【问题描述】:

我正在尝试从 bash 命令获取实时输出,以便我可以更轻松地处理数据。

在此代码中,命令iostat 1 工作正常,并在 1 秒后打印输出。命令sar -u 1 20 在命令行上按预期运行(每秒打印 1 行,最多 20 行),等待命令完成约 20 秒,然后以 0.1 秒的延迟打印每一行。

我计划无限期地运行这些命令,并且需要这部分工作。有什么想法吗?我在 OSX 上。

import subprocess
import time

# run a command and constantly check for new output, if you find it, print it and continue
# if the command is done, break out
try:
    command="sar -u 1 20"
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    while True:
        time.sleep(.1) # so i don't kill the cpu on the machine i'm checking
        output = process.stdout.readline()
        #if process.poll() is not None:
        #    break
        if output:
            print output.strip()
except KeyboardInterrupt:
    print 'Exiting...'
return_code = process.poll()
print return_code

【问题讨论】:

    标签: python bash subprocess


    【解决方案1】:

    sar 检测到其标准输出不是终端并缓冲其输出。它不会产生太多输出,因此缓冲区没有填满,无法在超时之前刷新到管道。

    如果您安装了 GNU coreutils,您可以使用 stdbuf 命令禁用标准输出的缓冲。 (如果您通过 Homebrew 安装,则安装为 gstdbuf。)

    command = "stdbuf -o 0 sar -u 1 20"
    

    我不确定是否有使用 Mac OS X 附带的工具的类似解决方案。

    【讨论】:

    • 这看起来像我的问题,我似乎无法安装它,但它应该通过 coreutils 安装。我找到了描述这个工具的apple.stackexchange.com/questions/193141/…
    • brew install coreutils之后需要使用gstdbuf;包以g 为所有命令名称添加前缀以避免与标准工具发生任何冲突(gls 而不是ls 等。stdbuf 不会冲突,但显然打包者希望保持一致。)
    • 在安装 coreutils 时遇到问题,看起来像 'make install' 的错误,有一个名称无限的文件:(,但这似乎是问题所在,我现在可以解决这个问题. 谢谢!
    【解决方案2】:

    来自:https://stackoverflow.com/a/17698359/16148

    对于 Python 2:

    from subprocess import Popen, PIPE
    
    p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)
    with p.stdout:
        for line in iter(p.stdout.readline, b''):
            print line,
    p.wait() # wait for the subprocess to exit
    

    【讨论】:

    • 不工作,代码更干净,但是 sar 命令仍然等到它完成才开始打印。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2019-02-24
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多