从python执行和捕获java执行的输出

从python执行和捕获java执行的输出,java,python,hadoop,jar,Java,Python,Hadoop,Jar,我已经使用HadoopAPI用java编写了一个程序。因此,java代码的输出是一个jar。。说foo.jar 要在hadoop中运行这个jar,我需要 hadoop jar foo.jar org.foo.bar.MainClass input output 这将启动一个很长的hadoop任务(比如几分钟) 作业正在运行时。。hadoop给了我进步。。像 Map 0%, Reduce 0% Map 20%, Reduce 0% .... 等等。。 作业结束后,hadoop会输出大量统计数据

我已经使用HadoopAPI用java编写了一个程序。因此,java代码的输出是一个jar。。说foo.jar

要在hadoop中运行这个jar,我需要

hadoop jar foo.jar org.foo.bar.MainClass input output
这将启动一个很长的hadoop任务(比如几分钟)

作业正在运行时。。hadoop给了我进步。。像

Map 0%, Reduce 0%
Map 20%, Reduce 0%
....
等等。。 作业结束后,hadoop会输出大量统计数据(如输入大小、拆分、记录等)。。 所有这些都是通过命令行完成的

现在,我想做的是。。从python调用此程序(使用简单的系统执行..)

但我想要的是。。当我运行这个python代码时。。我还想展示一些统计数据,但不是全部

所以,我要寻找的是一种方法来捕获jar执行所显示的这些统计数据,并在python中对其进行处理,然后显示处理后的统计数据

例如..默认情况下,hadoop显示

Map 0%, Reduce 0%
Map 20%, Reduce 0%

等等

也许我所拥有的是

def progress_function(map,reduce):

      return sum([map,reduce])/2.0
我正在命令提示符上显示

progress so far:0
progress so far:10

and so on..

长话短说。。我有一罐java程序。。当它被执行时会吐出一些数据。。我想从python运行这个java jar。。然后捕捉这些数据。。。然后在python中修改它们,并向用户显示这些python统计信息。

出于多种原因,您希望使用shell管道解决此类问题。从设计角度来看,它更灵活,从python调用进程可能会很尴尬,更重要的是,管道使python脚本在编程运行时更容易使用输出

hadoop jar foo.jar org.foo.bar.MainClass input output 2>&1 | python myscript.py
myscript.py
通过
stdin
接收输入,然后通过
print
正常输出


请注意,shell命令中的
2>&1
将stderr重定向到stdout,因为管道将输出从stdout而不是stderr移动。

听起来像是简单的管道