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

标签 python subprocess popen freeze web.py

这是我的主文件:

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/

相关文章:

python - 如何使用 Python 参数运行 PowerShell 脚本

postgresql - 如何在 Python 中使用正确的子进程 Pclose?

c - popen 与 KornShell 安全性

python - Django 值列表与值

python - 用于 SWIG、Python 的 C 函数错误代码的 %typemap 和 %exception

python - 从我的 python 脚本运行 perl 脚本,打印输出并等待它完成

python - 杀死 Popen 子进程

python - openpyxl 生成损坏的工作簿

python - 具有可变深度的多级默认字典?

python - 检查Python中子进程的内存使用情况