忽略来自subprocess.Popen输出[复制](Ignoring output from su

2019-07-19 10:49发布

这个问题已经在这里有一个答案:

  • 如何阅读一子的标准输出的第一个字节,然后丢弃其余的在Python? 2个回答

我从我的Python脚本调用Java程序,它输出了很多无用的信息,我不想。 我曾尝试addind stdout=None到POPEN功能:

subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None)

但它确实是相同的。 任何的想法?

Answer 1:

从3.3的文档 :

标准输入,输出和错误指定执行的程序的标准输入,标准输出和标准误差的文件句柄,分别。 有效值是PIPE,DEVNULL,现有的文件描述符(正整数),现有的文件对象,和无。

所以:

subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=subprocess.DEVNULL)

这种只存在于3.3及更高版本。 但文件说:

DEVNULL表明特殊文件os.devnull将被使用。

os.devnull存在的方式回到2.4(前subprocess存在)。 所以,你可以手动做同样的事情:

with open(os.devnull, 'w') as devnull:
    subprocess.check_call(['java', '-jar', 'foo.jar'], stdout=devnull)

请注意,如果你正在做的事情更加复杂,不适合到一个单一的线,你需要保持devnull开放的整个生命Popen对象,而不仅仅是它的建设。 (也就是说,把整个事情里面with说明。)

重定向到的优点/dev/null (POSIX)或NUL: (Windows)中是不创建不必要的管道,而且,更重要的是,不能碰到边缘情况下,在写入该管的子块。

它的缺点是,在理论上, subprocess可能会在一些平台上工作os.devnull没有。 如果你只关心对CPython的POSIX和Windows,PyPy和Jython(这是你最),这将永远不会成为一个问题。 对于其他情况,之前发布的测试代码。



Answer 2:

从文档 :

随着默认设置None ,则不会发生重定向。

您需要设置stdoutsubprocess.PIPE ,然后调用.communicate()并简单地忽略捕获的输出。

p = subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=subprocess.PIPE)
p.communicate()

虽然我怀疑使用subprocess.call()超过您的需求就足够了:

subprocess.call(['java', '-jar', 'foo.jar'], stdout=subprocess.PIPE)


文章来源: Ignoring output from subprocess.Popen [duplicate]