[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'?
...
答案 0 :(得分:1)
写入特定文件意味着如果程序一次运行多次,程序将会发生冲突,因为两个进程都希望写入同一文件。 (搜索临时文件创建和安全漏洞的问题)
使用管道意味着文件名唯一性没有问题。
你关心输出吗?如果没有,那么使用subprocess.DEVNULL
,它将为您丢弃输出。