首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于subprocess.stderr=STDOUT -- stdout=PIPE比stdout="a_file_name“好吗?

对于subprocess.stderr=STDOUT -- stdout=PIPE比stdout="a_file_name“好吗?
EN

Stack Overflow用户
提问于 2016-02-29 21:45:29
回答 1查看 773关注 0票数 1

编辑的

处理来自subprocess.Popen的标准输出的2个选项是stdout="a_file_name"stdout=subprocess.PIPE

stderr可以通过stderr=subprocess.STDOUT与其中任何一个结合。

对于我目前正在做的事情(模糊测试),我得到的stdout="a_file_name"代码稍微短一些,而且更干净。

然而,据我所见,stdout=PIPE似乎常常被其他人所青睐,但我不确定为什么要这么做。

如果在Popen([cmd, arg], ...) 中使用的Popen([cmd, arg], ...)是一个外部可执行文件,它将错误输出写入 stderr**,,则** stdout=PIPE 在某种程度上优于 stdout="a_file_name"**?**

各有哪些优点和缺点?

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

虽然我有我的特定背景,但我也想知道更一般情况下的答案。

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

代码语言:javascript
复制
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()

相对于:

代码语言:javascript
复制
...
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的利弊? 处理来自'subprocess.Popen‘的错误输出的两个主要选项似乎是'stderr=STDOUT’(带有‘stdout=“some_file’)和'stderr=PIPE‘。 对于我想要做的事情(模糊测试),我得到的'stderr=STDOUT‘代码更短、更干净。 然而,从我所读到的情况来看,“stderr=PIPE”似乎是首选的,但我不确定为什么。 如果使用的'cmd‘是将错误输出写入'stderr’的外部可执行文件,那么使用'stderr=STDOUT‘与'stderr=PIPE’的优缺点是什么? ..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 20:28:50

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

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

你关心输出吗?如果没有,那么使用subprocess.DEVNULL,它将为您丢弃输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35710305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档