【问题标题】:How to run a subprocess in the background python [duplicate]如何在后台python中运行子进程[重复]
【发布时间】:2013-12-16 00:34:57
【问题描述】:

我正在用 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 方法完成运行并返回值后将其杀死?非常感谢。

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    process.wait() 正在阻止您的进程。删除该行,其余代码将运行。 然后你可以通过调用Popen.terminate()结束它

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

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

    如果您不调用process.wait(),您的代码将继续执行。但是你仍然可以控制其他进程,如果需要,你可以执行process.terminate() 甚至process.kill() 之类的操作。

    【讨论】:

    • CreateProcess 在 Windows 上使用。 Popen 在 POSIX 系统上调用 execv(3)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2013-09-21
    • 2016-04-15
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多