如何在后台python中运行子进程

时间:2013-11-29 19:12:40

标签: python subprocess

我正在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方法运行完毕并且返回值后终止它?非常感谢。

1 个答案:

答案 0 :(得分:10)

process.wait()阻止了您的流程。删除该行,其余代码将运行。 然后,您可以通过调用Popen.terminate()

来结束它

Popen正在调用 CreateProcess ,这意味着操作系统启动一个新进程并返回要存储在进程变量中的PID。

如果您使用process.wait(),那么您的代码将等到最近创建的流程结束(在这种情况下它永远不会结束,除非您在外部终止它。)

如果您不致电process.wait(),您的代码将继续执行。但您仍然可以控制其他流程,如果需要,您可以执行process.terminate()甚至process.kill()等操作。