You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python无法终止子进程中运行的FastAPI服务器问题求助

问题描述

我使用Python的subprocess模块,通过Popen启动子进程运行服务器,代码如下:

# 创建运行服务器的进程
process = Popen("poetry run -vvv python ./app/server.py", cwd="./api", stderr=PIPE, stdin=PIPE, stdout=PIPE)

该脚本会向服务器发送数据,待收到所有响应后需要关闭子进程。其中server.py通过uvicorn启动FastAPI服务器,监听localhost:8000。

我尝试过以下方法均无法终止子进程:

  • kill()
  • terminate()
  • send_signal(CTRL_C_EVENT)
  • send_signal(SIGINT)
  • send_signal(SIGTERM)
  • os.kill(process.pid, SIGINT)
  • os.kill(process.pid, SIGTERM)
  • os.kill(process.pid, SIGKILL)
  • process.stdin.write(b'q') + process.stdin.flush()
  • subprocess.call("taskkill /f /pid {pid}".format(pid=process.pid))

每次都需要手动执行netstat -a -o -n | findstr 8000找到进程PID,再用tasklist | findstr pid确认是Python进程,最后通过taskkill /f /pid pid终止。

我在脚本末尾调用以下函数后,发现报错中的PID与手动查找的PID不匹配:

def kill_subprocess(subp):
    if os.name == 'nt':
        call("taskkill /T /F /PID {pid}".format(pid=subp.pid))

    elif os.name == 'posix':
        os.killpg(os.getpgid(subp.pid), signal.SIGTERM)

    if subp.wait() != 0:
        print("subprocess return code = {code}".format(code=subp.returncode))
        raise RuntimeError("subprocess {pid} still running".format(pid=subp.pid))

意识到仅杀死了poetry进程后,我改用taskkill /F /T /PID,输出显示所有进程已终止,但subp.wait()返回1并报错:

Opération réussie: le processus de PID 17216 (processus enfant de PID 13840) a été
arrété.
Opération réussie: le processus de PID 13840 (processus enfant de PID 6976) a été
arrété.
Opération réussie: le processus de PID 6976 (processus enfant de PID 11976) a été
arrété.
Opération réussie: le processus de PID 11976 (processus enfant de PID 17132) a été
arrété.
Opération réussie: le processus de PID 17132 (processus enfant de PID 5344) a été
arrété.
Opération réussie: le processus de PID 5344 (processus enfant de PID 17904) a été
arrété.
subprocess return code = 1
Traceback (most recent call last):
  File "C:\Users\oscar\Desktop\HEIG\TB\autograder-test.py", line 164, in <module>
    kill_subprocess(process)
  File "C:\Users\oscar\Desktop\HEIG\TB\autograder-test.py", line 123, in kill_subprocess
    raise RuntimeError("subprocess {pid} still running".format(pid=subp.pid))
RuntimeError: subprocess 5344 still running

请问这是进程真的未终止,还是subp.wait() !=0的判断逻辑有误?


内容的提问来源于stack exchange,提问作者Oscar Baume

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:53:11