当前位置: 首页 > 面试题库 >

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

唐恺
2023-03-14
问题内容

从文档中的示例subprocess.run()来看,似乎不应该有任何输出

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

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


问题答案:

这是按清洁度递减的顺序 抑制 输出的方法。他们假设您使用的是Python 3。

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

    import subprocess

    subprocess.run([‘ls’, ‘-l’], stdout=subprocess.DEVNULL)

    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)

  2. 如果要使用完全手动的方法,可以/dev/null自己打开文件句柄来重定向到。其他所有内容都与方法1相同。

    import os
    import subprocess

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

以下是按清洁度递减的顺序 捕获 输出(以供以后使用或解析)的方法。他们假设您使用的是Python 3。

  1. 如果您只是想同时捕获STDOUT和STDERR,并且您使用的是Python> = 3.7,请使用capture_output=True

    import subprocess

    result = subprocess.run([‘ls’, ‘-l’], capture_output=True)
    print(result.stdout)
    print(result.stderr)

  2. 您可以用来subprocess.PIPE独立捕获STDOUT和STDERR。这 确实 对Python版本<3.7,如Python 3.6的工作。

    import subprocess

    result = subprocess.run([‘ls’, ‘-l’], stdout=subprocess.PIPE)
    print(result.stdout)

    To also capture stderr…

    result = subprocess.run([‘ls’, ‘-l’], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    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)
    print(result.stdout)

注意
:默认情况下,捕获的输出返回为bytes。如果要捕获为文本(例如str),请使用universal_newlines=True(或在Python>
= 3.7上,使用无限清晰和易于理解的选项text=True-相同,universal_newlines但名称不同)。



 类似资料:
  • 问题内容: 如何在Go测试中捕获或抑制stdout? 我正在尝试自学go(lang)测试。在下面的代码中,myshow.LoadPath将大量信息输出到stdout(这是正常的副作用)。但是,当我运行“ go test”时,确实会产生非常嘈杂的输出。有没有办法抑制或捕获stdout? 为了进行比较,我正在考虑python世界中的类似问题。http://pytest.org/latest/captu

  • 问题内容: 我决定尝试使用npm脚本作为构建工具,到目前为止,我还是喜欢它。我想解决的一个问题是,当运行脚本运行jshint时,如果没有通过处理,我会收到很多“ npm ERR!”!线。我想抑制这些,因为短绒棉的输出更有意义。 是否有一种全局设置此属性的好方法,并且有一种方法可以针对每次运行的脚本进行设置? 问题答案: 所有脚本: 您可以通过以下几种方式将日志级别设置为,从而通过整体抑制npm的输

  • 我想使用Mavens创建一个类路径: 如何在不抑制的预期输出的情况下阻止Mavens信息垃圾邮件? 我找到了答案,解释了我必须使用选项来抑制信息输出。但使用此选项将不会产生任何输出。 我知道我可以使用,但我希望避免使用它。我不敢相信Maven能做到这一点,因为它使依赖插件变得毫无用处。 这是完整的POM:

  • 问题内容: 我一直在四处寻找,但还没有找到如何执行此操作的方法(尽管在分析其性能方面发现了很多内容!!) 我想执行一次选择,该操作返回几列数据,然后返回另一个表中的相关行的嵌套表(实际上是同一张表本身连接在一起,但我认为这是无关紧要的)。 所以数据是这样的: 这个想法是执行选择,以查找所有可能与注册帐户相关的未注册人员。 所以结果看起来像 我可以使用SQL来处理所有选择条件,并且有一个查询返回可以

  • 我已经决定尝试使用npm脚本作为构建工具,到目前为止我很喜欢它。我想解决的一个问题是,当运行一个脚本来运行jshint时,当某些东西没有通过linting时,我会得到大量的“npm ERR!”行。我想抑制这些,因为linter的输出更有意义。 是否有一种全局设置的好方法,以及是否有一种为每次脚本运行设置它的方法?

  • 问题内容: 我正在批量执行一些SQL语句(使用命令行二进制文件)。我希望我的几个SELECT语句之一不打印列标题,而只打印所选记录。这可能吗? 问题答案: 调用mysql用(别名为是)选项: 感谢ErichBSchulz指出-N别名。 要删除结果周围的网格(垂直和水平线),请使用()。列用字符分隔。 要输出没有标题且没有网格的数据,只需使用和即可。