Java 从Python调用JAR

Java 从Python调用JAR,java,python,jar,io,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', 'actio

我的代码如下:

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". 
有什么解决办法吗?谢谢

communicate()
等待进程终止,这就解释了您遇到的错误——您第二次调用它时,进程不再运行

这实际上取决于JAR是如何编写的,以及它所期望的输入类型。如果它支持根据输入多次执行其操作,并且您可以通过这种方式重新格式化输入,那么它就可以工作。如果JAR只执行一次任务并终止,那么您就无能为力了

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

您可以使用类似的工具来节省启动Java虚拟机的成本