[已编辑]
2个选项,用于处理子流程的标准输出。Popen是stdout=“a_file\u name”和stdout=subprocess.PIPEstderr
可以通过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”的优缺点是什么?
...
写入特定文件意味着,如果程序一次运行多次,则会发生冲突,因为两个进程都希望写入同一个文件。(搜索临时文件创建和安全漏洞问题)
使用管道意味着不存在文件名唯一性问题。
你关心输出吗?如果不是,那么使用子进程。DEVNULL
它会为你丢弃输出。
问题内容: 我想将子进程的stderr输出重定向到stdout。常量应该这样做,不是吗? 然而, 确实 输出了一些东西。为什么会这样,如何在stdout上得到错误消息? 问题答案: 仔细阅读源代码即可得出答案。特别是,该文档在显示以下内容时会产生误导: 表示(…)的特殊值表示标准错误应与标准输出进入同一 句柄 。 由于在求值时stdout设置为“默认”(技术上来说),因此stderr也设置为“默认
我正在学习,但我对这段代码有点困惑: 输出: 如您所见,输出是格式化的。但是我不知道为什么结尾有字符和。 如果我在终端中运行此命令,则没有这些字符。 正常输出: 我怎样才能移除它们?
问题内容: 我想捕获并显示通过Python的子流程调用的流程的输出。 我以为我可以将文件状对象作为参数stdout和stderr传递 我可以看到它访问了属性-因此它正在处理对象。但是,永远不会调用该方法。我的方法是否完全无效或我只是缺少什么? 更新: 我还想工作的是ANSI控制字符,用于移动光标并覆盖以前的输出内容。我不知道这是否是正确的术语,但这是我的意思的一个示例:我正在尝试使一些GIT自动化
问题内容: 我想通过python从目录中调用脚本(它们是可执行的shell脚本)。 到现在为止还挺好: 现在我想要的是:假设我有一个具有启动功能的bash脚本。我从那里打电话 回声“某事” 现在,我想看看sys.stdout和退出代码上的回显。我相信您可以使用.communicate()执行此操作,但是我的操作不符合我的预期。 我究竟做错了什么? 任何帮助深表感谢 问题答案: 授予http://d
问题内容: 我对这三个文件的目的感到困惑。如果我的理解是正确的,则是程序在其中写入其在进程中运行任务的请求的文件,是内核在其中写入其输出以及请求其从中访问信息的进程的文件,并且是该文件。输入所有例外。在打开这些文件以检查它们是否确实发生时,我似乎没有任何暗示! 我想知道的是这些文件的用途到底是什么,用很少的技术术语就可以完全肯定答案! 问题答案: 标准输入 -这是您的过程读取以获取您的信息的 文件
在内部Hibernate时,假设使用。那么会不会消耗更多的内存呢?和如何在内部工作?