我有以下代码:
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".
这有什么解决方案吗?谢谢!
答案 0 :(得分:0)
communicate()
等待进程终止,这样就解释了你得到的错误 - 第二次调用它时,进程不再运行了。
这实际上取决于JAR的编写方式以及它所期望的输入类型。如果它支持基于输入多次执行其动作,并且如果您可以通过这种方式重新格式化输入,那么它将起作用。如果JAR做了一次并终止,那么你就无能为力了。
如果您不介意编写一些Java,可以在action.jar
中的类周围添加一个包装器,它依次获取您的样本输入并将它们传递给jar中的代码。
您可以使用Nailgun等工具节省启动Java虚拟机的成本。