如何抑制或捕获 subprocess.run()的输出?

subprocess.run()上的文档中的例子来看,似乎不应该有任何来自

subprocess.run(["ls", "-l"])  # doesn't capture output

但是,当我在 pythonshell 中尝试它时,清单会被打印出来。我想知道这是否是默认行为,以及如何抑制 run()的输出。

163607 次浏览

下面是如何按照降低清洁级别的顺序输出 压制

  1. 您可以重定向到特殊的 subprocess.DEVNULL目标。
import subprocess


subprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL)
# The above only redirects stdout...
# this will also redirect stderr to /dev/null as well
subprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Alternatively, you can merge stderr and stdout streams and redirect
# the one stream to /dev/null
subprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
  1. 如果你想要一个完全手动的方法,可以重定向到 /dev/null打开文件句柄自己。其他一切都将与方法 # 1相同。
import os
import subprocess


with open(os.devnull, 'w') as devnull:
subprocess.run(['ls', '-l'], stdout=devnull)

下面是如何 捕捉输出(以后使用或解析) ,以降低清洁度水平。他们以为你在参加 Python 3。

注意: 下面的示例使用 text=True

  • 这将导致 STDOUT 和 STDERR 被捕获为 str而不是 bytes
    • 省略 text=True以获取 bytes数据
  • text=True只是 Python > = 3.7,在 Python < = 3.6上使用 universal_newlines=True
    • universal_newlines=Truetext=True相同,但类型更为详细,但应该存在于所有 Python 版本中
  1. 如果您只是想独立地捕获 STDOUT 和 STDERR,并且在 Python > = 3.7上,那么使用 capture_output=True
import subprocess


result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
print(result.stderr)
  1. 您可以使用 subprocess.PIPE独立地捕获 STDOUT 和 STDERR。
import subprocess


result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, text=True)
print(result.stdout)


# To also capture stderr...
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
print(result.stdout)
print(result.stderr)


# To mix stdout and stderr into a single string
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
print(result.stdout)

捕获 ls -a的输出

import subprocess
ls = subprocess.run(['ls', '-a'], capture_output=True, text=True).stdout.strip("\n")
print(ls)