0

我正在尝试使用 python 执行一些 bash 命令。我想向用户显示命令的实时输出并捕获它。
一个示例就像

import subporcess

# This will store output in result but print nothing to terminal
result = subprocess.run(['ls', '-lh'], check=True, universal_newlines=True, stdout=subprocess.PIPE)
print(result.stdout) # STD OUTPUT
# This will print everything to terminal result will be empty
result = subprocess.run(['ls', '-lh'], check=True, universal_newlines=True)
print(result.stdout) # OUTPUT = None
4

1 回答 1

2

这是一种可能性,它将从长时间运行的进程中收集输出行,将它们写入终端,并在进程退出时将它们全部返回。

它返回输出行的列表,而不是返回check_outputrun将返回的完整文本块,但这很容易更改。根据您期望的输出量,也许 IO 缓冲区可能更有效。

import subprocess
import sys

def capture_and_echo_stdout(cmd):
    """ Start a subprocess and write its stdout to stdout of this process.     
    Capture and return stdout lines as a list. """
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    stdout_lines = []
    for line in proc.stdout:
        sys.stdout.write(line.decode())
        stdout_lines.append(line)
    proc.communicate()
    # Roughly equivalent to check=True
    if proc.returncode:
        raise subprocess.CalledProcessError(proc.returncode, cmd)
    return stdout_lines

这个答案中有一些类似的选项(尽管更多的重点是写入多个文件,如 unix tee):How to replicate tee behavior in Python when using subprocess?

于 2021-06-21T13:55:46.563 回答