这是我的主文件:
import subprocess, time
pipe = subprocess.PIPE
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe)
time.sleep(3)
这是 test_web_app.py:
import web
class Handler:
def GET(self): pass
app = web.application(['/', 'Handler'], globals())
app.run()
当我运行主文件时,程序执行了,但是一个僵尸进程挂了,我必须手动杀死它。为什么是这样?程序结束时如何让 Popen 死掉?只有当我在程序结束前通过管道传输 stdout 并休眠一段时间时,Popen 才会挂起。
编辑 -- 这是主文件的最终工作版本:
import subprocess, time, atexit
pipe = subprocess.PIPE
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe)
def kill_app():
popen.kill()
popen.wait()
atexit.register(kill_app)
time.sleep(3)
请您参考如下方法:
你还没有wait编的过程。完成后,您必须调用 popen.wait。
您可以使用 popen 对象的 poll 方法检查进程是否已终止,以查看它是否已完成。
如果您不需要 Web 服务器进程的 stdout,您可以简单地忽略 stdout 选项。
您可以使用 atexit模块来实现一个 Hook ,该 Hook 在主文件退出时被调用。这应该使用 Popen 对象的 kill 方法,然后对其进行 wait 以确保它已终止。
