忽略subprocess.Popen的输出

时间:2013-02-06 17:19:07

标签: python subprocess

我从我的Python脚本调用java程序,它输出了许多我不想要的无用信息。我已经尝试将addind stdout=None添加到Popen函数中:

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

但它也是如此。有什么想法吗?

2 个答案:

答案 0 :(得分:33)

来自3.3 documentation

  

stdin,stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为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没有的某些平台。如果您只关心POSIX和Windows,PyPy和Jython(大多数人)的CPython,这将永远不会成为问题。对于其他情况,请在分发代码之前进行测试。

答案 1 :(得分:6)

来自documentation

  

使用默认设置None,不会发生重定向。

您需要将stdout设置为subprocess.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)