我正在python中编写一个应用程序,它通过使用python子进程调用shell脚本来启动java中的JVM.但是,我的问题是我编写的正确方法,JVM启动并阻止其后发生的其余进程.我需要JVM在我调用另一个函数时运行,并且我需要在进程运行完毕后停止JVM.
Python代码:
process = subprocess.Popen('runJVM.sh', shell=True, stderr=subprocess.STDOUT) process.wait() r = Recommender() r.load() assert len(sys.argv) > 1, '%d arguments supplied, one needed' %(len(sys.argv)-1) print "recommendations" + str(r.get_users_recommendation(sys.argv[1:])) .... def get_users_recommendation(self, user_list): j_id_list = ListConverter().convert(class_list, self.gateway._gateway_client) recs = self.gateway.entry_point.recommend(j_id_list) return recs
哪里:
from py4j.java_gateway import JavaGateway self.gateway = JavaGateway()
我无法get_user_recommendations
运行,因为JVM服务器阻止了该进程.我如何不阻止Python脚本的其余部分,然后在python方法运行完毕并且返回值后终止它?非常感谢.
process.wait()
阻止你的过程.删除该行,其余代码将运行.然后你可以通过电话结束它Popen.terminate()
Popen正在调用CreateProcess,这意味着操作系统启动一个新进程并返回要存储在流程变量中的PID .
如果你使用process.wait()
,那么你的代码将等到最近创建的进程结束(在这种情况下它永远不会结束,除非你在外部终止它).
如果您不打电话process.wait()
,您的代码将继续执行.但你仍然可以控制其他过程,你可以做process.terminate()
甚至process.kill()
必要的事情.