【问题标题】:executing and capturing output of java execution from python从python执行和捕获java执行的输出
【发布时间】:2013-10-24 00:42:06
【问题描述】:

我使用 hadoop api 在 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程序的jar..执行时会吐出一些统计信息..我想从python运行这个java jar..然后捕获这些统计信息...然后修改它们在 python 中并向用户显示这些 python 统计信息。

【问题讨论】:

  • 听起来像简单的管道

标签: java python hadoop jar


【解决方案1】:

出于多种原因,您希望使用 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 会将标准错误重定向到标准输出,因为管道将输出从标准输出而不是标准错误移动。

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多