Skip to main content
 首页 » 编程设计

python之web.py + 子进程 = 挂起

2024年09月03日36daizhj

这是我的主文件:

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 以确保它已终止。