2015-12-12 55 views
0

我有下面的代碼:調用JAR從Python的

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 

裝入罐子花費大量的時間和效率非常低。有沒有什麼辦法可以避免第二次重新加載它,在第二行p = Popen(...)中,也就是在開始時只加載一次並繼續使用該實例?我試圖刪除第二行不成功,Python抱怨:

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

有沒有解決這個問題?謝謝!

回答

0

communicate()等待進程終止,以便解釋出現的錯誤 - 第二次調用它時,進程不再運行。

這真的取決於JAR是如何寫的,那種投入的預計。如果它支持根據輸入不止一次執行其操作,並且如果您可以用這種方式重新格式化輸入,那麼它就可以工作。如果JAR一旦完成並終止,那麼您就無能爲力了。

如果您不介意編寫一些Java代碼,您可以在action.jar的類中添加一個包裝,它會依次接受您的示例輸入並將它們傳遞給jar中的代碼。

可以節省啓動Java虛擬機,使用的工具,像Nailgun的成本。