这是我的主文件:
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
以确保其终止。
关于python - web.py + 子进程 = 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5026639/