我正在从我的 Python 脚本中调用一个 java 程序,它输出了很多我不想要的无用信息。我已经尝试添加stdout=None
到 Popen 函数:
subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None)
但它也是一样的。任何的想法?
我正在从我的 Python 脚本中调用一个 java 程序,它输出了很多我不想要的无用信息。我已经尝试添加stdout=None
到 Popen 函数:
subprocess.Popen(['java', '-jar', 'foo.jar'], stdout=None)
但它也是一样的。任何的想法?
从3.3 文档:
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,那么这永远不会成为问题。对于其他情况,请在分发代码之前进行测试。
从文档中:
使用默认设置
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)