隐藏 subprocess.check_call 的输出。不使用 stderr 和 stdout

问题描述 投票:0回答:1

我使用 subprocess.check_call 调用另一个脚本,但我不想在控制台上看到其他脚本的打印结果。 我尝试过:stdout=subprocess.DEVNULL 和 stderr=subprocess.DEVNULL,但我仍然看到打印了一些输出。

我的脚本之一使用 stderr,另一个使用 stdout。 为什么不起作用?

subprocess.check_call(cmd, timeout=timeout_sec, shell=True,  stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 

如果我需要 stdout 或 stderr,我可以找到什么?

python subprocess
1个回答
0
投票

我没有使用

check_call
,而是使用
run
,它提供了更多选项。

import subprocess


def main():
    cmd = ["./doit.sh"]  # Can be anything
    timeout_sec = 10

    completed_process = subprocess.run(
        cmd,
        timeout=timeout_sec,
        shell=True,
        check=True,  # Behave like check_call
        text=True,  # Capture stdout, stderr as text, not bytes
        capture_output=True,  # Capture to internal .stdout, .stderr
    )

    # Do something with stdout and stderr
    print("STDOUT:")
    print(completed_process.stdout)
    print("STDERR:")
    print(completed_process.stderr)


if __name__ == "__main__":
    main()

注释

  • run
    函数返回一个CompletedProcess对象,其中包括stdout、stderr等属性
  • 通常,stdout 和 stderr 是字节,
    text=True
    参数会改变它,所以它们是 str
  • capture_output=True
    参数将抑制 stdout 和 stderr 的打印,并将它们捕获到
    CompletedProcess
    对象的属性中。
© www.soinside.com 2019 - 2024. All rights reserved.