当前位置: 首页 > 知识库问答 >
问题:

对于子流程。stderr=STDOUT-STDOUT=PIPE是否优于STDOUT=“a\u file\u name”?

吕作人
2023-03-14

[已编辑]
2个选项,用于处理子流程的标准输出。Popen是stdout=“a_file\u name”和stdout=subprocess.PIPE
stderr可以通过stderr=subprocess.STDOUT与其中任何一个组合。

对于我目前正在做的事情(模糊测试),我生成的stdout="a_file_name"代码稍微短一点,也更干净。

然而,从我所看到的情况来看,其他人似乎更喜欢stdout=PIPE,但我不确定所有原因。

如果Popen([cmd, arg],...)中使用的cmd是将错误输出写入stderr的外部可执行文件,那么stdout=PIPE是否比stdout="a_file_name"更好?

每种方法的优缺点是什么?

  • 在我的特定上下文中(请参阅下面的代码片段),我可以看到使用stdout=PIPE而不是stdout="a_file_name"的一个优势是前者可以让我轻松跳过编写空文件。
  • cmd崩溃的情况下,2个中的1个是否更有可能获得所有错误输出?

虽然我有自己的特殊背景,但我也有兴趣知道更一般情况的答案。

为了更好地解释我的上下文,以下是我的两个可选代码段:

import subprocess
import sys

assert sys.version_info >= (3, 3)
    # timeout added for subprocess's wait() and communicate() in Python 3.3.

with open('sub_proc1.outerr', 'w') as f_outerr1:
    sub_proc1 = subprocess.Popen([cmd, args], stdout=f_outerr1,
                                 stderr=subprocess.STDOUT,
                                 universal_newlines=True)
    try:
        return_code = sub_proc1.wait(timeout=10)
        print('*** %s CRASHED with return code: %d.' % (cmd, return_code))
    except subprocess.TimeoutExpired:
        print('*** %s succeeded.' % cmd)
        sub_proc1.kill()

与:

...
with open('sub_proc2.outerr', 'w') as f_outerr2:
    sub_proc2 = subprocess.Popen([cmd, args], stdout=subprocess.PIPE,
                                 stderr=subprocess.STDOUT,
                                 universal_newlines=True)
    try:
        (sub_proc2_out, sub_proc2_err) = sub_proc2.communicate(timeout=10)
        print('*** %s CRASHED with return code: %d.' %
              (cmd, sub_proc2.poll()))
        assert sub_proc2_err is None
            # Since stderr was redirected to STDOUT, this should be None.
        f_outerr2.write(str(sub_proc2_out or ""))
            # Treat 'None' as an empty string).
    except subprocess.TimeoutExpired:
        print('*** %s succeeded.' % cmd)
        sub_proc2.kill()

原职务:

标题:子流程:stderr=STDOUT与stderr=PIPE的利弊?

处理子流程错误输出的两个主要替代方案。“Popen”似乎是“stderr=STDOUT”(带有“STDOUT=”some_file“)和“stderr=PIPE”。

对于我想做的事情(模糊测试),我生成的“stderr=STDOUT”代码更短、更干净。

然而,从我所读到的,似乎'stderr=PIPE'是首选,但我不确定所有的原因。

如果使用的“cmd”是将错误输出写入“stderr”的外部可执行文件,那么使用“stderr=STDOUT”与“stderr=PIPE”的优缺点是什么?

...


共有1个答案

东门新立
2023-03-14

写入特定文件意味着,如果程序一次运行多次,则会发生冲突,因为两个进程都希望写入同一个文件。(搜索临时文件创建和安全漏洞问题)

使用管道意味着不存在文件名唯一性问题。

你关心输出吗?如果不是,那么使用子进程。DEVNULL它会为你丢弃输出。

 类似资料:
  • 问题内容: 我想将子进程的stderr输出重定向到stdout。常量应该这样做,不是吗? 然而, 确实 输出了一些东西。为什么会这样,如何在stdout上得到错误消息? 问题答案: 仔细阅读源代码即可得出答案。特别是,该文档在显示以下内容时会产生误导: 表示(…)的特殊值表示标准错误应与标准输出进入同一 句柄 。 由于在求值时stdout设置为“默认”(技术上来说),因此stderr也设置为“默认

  • 我正在学习,但我对这段代码有点困惑: 输出: 如您所见,输出是格式化的。但是我不知道为什么结尾有字符和。 如果我在终端中运行此命令,则没有这些字符。 正常输出: 我怎样才能移除它们?

  • 问题内容: 我想捕获并显示通过Python的子流程调用的流程的输出。 我以为我可以将文件状对象作为参数stdout和stderr传递 我可以看到它访问了属性-因此它正在处理对象。但是,永远不会调用该方法。我的方法是否完全无效或我只是缺少什么? 更新: 我还想工作的是ANSI控制字符,用于移动光标并覆盖以前的输出内容。我不知道这是否是正确的术语,但这是我的意思的一个示例:我正在尝试使一些GIT自动化

  • 问题内容: 我想通过python从目录中调用脚本(它们是可执行的shell脚本)。 到现在为止还挺好: 现在我想要的是:假设我有一个具有启动功能的bash脚本。我从那里打电话 回声“某事” 现在,我想看看sys.stdout和退出代码上的回显。我相信您可以使用.communicate()执行此操作,但是我的操作不符合我的预期。 我究竟做错了什么? 任何帮助深表感谢 问题答案: 授予http://d

  • 问题内容: 我对这三个文件的目的感到困惑。如果我的理解是正确的,则是程序在其中写入其在进程中运行任务的请求的文件,是内核在其中写入其输出以及请求其从中访问信息的进程的文件,并且是该文件。输入所有例外。在打开这些文件以检查它们是否确实发生时,我似乎没有任何暗示! 我想知道的是这些文件的用途到底是什么,用很少的技术术语就可以完全肯定答案! 问题答案: 标准输入 -这是您的过程读取以获取您的信息的 文件

  • 在内部Hibernate时,假设使用。那么会不会消耗更多的内存呢?和如何在内部工作?