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
相关产品推荐
相关产品推荐

