从Python调用JAR

时间:2015-12-12 21:15:07

标签: java python jar io

我有以下代码:

from subprocess import Popen, PIPE, STDOUT 

p = Popen(['java', '-jar', 'action.jar'], stdin=PIPE, stdout=PIPE, stderr=STDOUT)
stdout1, stderr1 = p.communicate(input=sample_input1)
print "Result is", stdout1

p = Popen(['java', '-jar', 'action.jar'], stdin=PIPE, stdout=PIPE, stderr=STDOUT)
stdout2, stderr2 = p.communicate(input=sample_input2)
print "Result is", stdout2

加载jar需要花费大量时间并且效率非常低。有没有办法避免第二次重新加载它,在第二行p = Popen(...),即只在开始时加载一次并继续使用该实例?我试图删除第二行失败,Python抱怨:

"ValueError: I/O operation on closed file". 

这有什么解决方案吗?谢谢!

1 个答案:

答案 0 :(得分:0)

communicate()等待进程终止,这样就解释了你得到的错误 - 第二次调用它时,进程不再运行了。

这实际上取决于JAR的编写方式以及它所期望的输入类型。如果它支持基于输入多次执行其动作,并且如果您可以通过这种方式重新格式化输入,那么它将起作用。如果JAR做了一次并终止,那么你就无能为力了。

如果您不介意编写一些Java,可以在action.jar中的类周围添加一个包装器,它依次获取您的样本输入并将它们传递给jar中的代码。

您可以使用Nailgun等工具节省启动Java虚拟机的成本。