编辑的
处理来自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崩溃的情况下,两个中的一个是否更有可能得到所有的错误输出?虽然我有我的特定背景,但我也想知道更一般情况下的答案。
为了更好地解释我的上下文,下面是我的两个可选代码段:
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的利弊? 处理来自'subprocess.Popen‘的错误输出的两个主要选项似乎是'stderr=STDOUT’(带有‘stdout=“some_file’)和'stderr=PIPE‘。 对于我想要做的事情(模糊测试),我得到的'stderr=STDOUT‘代码更短、更干净。 然而,从我所读到的情况来看,“stderr=PIPE”似乎是首选的,但我不确定为什么。 如果使用的'cmd‘是将错误输出写入'stderr’的外部可执行文件,那么使用'stderr=STDOUT‘与'stderr=PIPE’的优缺点是什么? ..。
发布于 2016-03-01 20:28:50
写入特定文件意味着,如果程序一次运行不止一次,则程序将发生冲突,因为两个进程都希望写入同一个文件。(搜索临时文件创建和安全漏洞问题)
使用管道意味着不存在文件名唯一性问题。
你关心输出吗?如果没有,那么使用subprocess.DEVNULL,它将为您丢弃输出。
https://stackoverflow.com/questions/35710305
复制相似问题