对于subprocess.stderr = STDOUT - stdout = PIPE是否优于stdout =“a_file_name”?

时间:2016-02-29 21:45:30

标签: python subprocess stdout popen stderr

[EDITED]
处理subprocess.Popen标准输出的2个选项是stdout="a_file_name"stdout=subprocess.PIPE stderr可以通过stderr=subprocess.STDOUT组合使用stdout="a_file_name"

对于我目前正在做的事情(模糊测试),我生成的stdout=PIPE代码略短且更清晰。

然而,从我所看到的情况来看,cmd似乎经常被其他人所青睐,但我不确定所有原因。

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

各自有哪些优点和缺点?

  • 在我的特定上下文中(请参阅下面的代码段),我可以看到使用stdout="a_file_name"而不是cmd的一个优点是,前者会让我轻松跳过编写空文件。
  • 如果发生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() 崩溃,2中的1个可能会更有可能获得所有错误输出吗?

虽然我有特定的背景,但我也有兴趣了解更一般情况的答案。

为了更好地解释我的上下文,这里是我的两个替代代码段:

...
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()

input

原始邮件:

  

TITLE:subprocess:stderr = STDOUT vs. stderr = PIPE的优缺点?

     

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

     

对于我想要做的事情(模糊测试),我得到的'stderr = STDOUT'   代码更短更清洁。

     

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

     

如果使用的'cmd'是写入错误输出的外部可执行文件   对'stderr',使用'stderr = STDOUT'的利弊是什么   与'stderr = PIPE'?

     

...

1 个答案:

答案 0 :(得分:1)

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

使用管道意味着文件名唯一性没有问题。

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