gpt4 book ai didi

Python 使用 subprocess.Popen 关闭所有线程或进程

转载 作者:行者123 更新时间:2023-12-01 04:03:57 27 4
gpt4 key购买 nike

我正在开发一个简单的 GUI 应用程序。

在我的真实案例中,此应用程序启动 Django (python manage.py runserver) Web 服务器并关闭 Django Web 服务器。为了简化应用程序的可测试性,我用 sleep 命令替换 django start webserver。

当我触发启动服务器按钮时:服务器启动。然后,我触发停止服务器按钮,进程就会关闭。

但是 django Web 服务器(或 sleep 命令)仍在工作。

如何停止进程并停止 subprocess.Popen 调用的命令?

这是我的代码:

#!/usr/bin/python
# coding:utf-8
import os
import sys
import subprocess
import time
import datetime
import zipfile
import subprocess
from concurrent import futures
from threading import Thread
from multiprocessing import Process

try:
import Tkinter as tk
except ImportError:
import tkinter as tk

def runserver():
cmd = 'sleep 60'
# os.system(cmd)
subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read()
print('TERMINATE BY TIMEOUT')
return True

class WindowMain:

def __init__(self, master):
self.thread_srv = None
self.master = master
self.frame = tk.Frame(self.master)

self.lbl = tk.Label(text="")
self.lbl.pack()

self.btn_quit = tk.Button(self.frame, text="Stop server", width=25, command=lambda: self.stop_server())
self.btn_quit.pack()

self.button1 = tk.Button(self.frame, text="Start Server", width=25, command=lambda: self.runserver_thread())
self.button1.pack()

self.frame.pack()

def stop_server(self):
if self.thread_srv:
print('THREAD')
self.thread_srv.terminate()
else:
print("NOT THREAD")

def runserver_thread(self):
self.thread_srv = Process(target=runserver)
self.thread_srv.start()

current_dir = os.path.dirname(os.path.abspath(__file__))

def quit(root):
root.quit
sys.exit()

def main():
root = tk.Tk()
tk.Button(root, text="Quitter", command=lambda: quit(root)).pack()
app = WindowMain(root)
root.mainloop()

if __name__ == '__main__':
main()

解决方案(在ForceBru的回答之后)

我编写了这个关闭 django 服务器的函数:

def close_django_runserver():
if 'win' in sys.platform:
pass
else:
cmd = 'ps aux'
output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read()
process_list = output.split("\n")
for process in process_list:
if 'manage.py' in process and 'runserver' in process:
pid = re.sub(r'^[^\s]+\s+(\d+)\s+.*$', r'\1', process)
subprocess.Popen('kill '+str(pid), shell=True, stdout=subprocess.PIPE).stdout.read()

当然存在更好的解决方案,但它确实有效。我稍后会编写 Windows 解决方案。

最佳答案

您运行 Django 启动脚本,一切都得到初始化和设置,然后新创建的 Django 进程进入后台(获得*守护进程*)与您的线程断开连接

因此,当您终止该线程时,实际上并没有终止任何内容,因为该启动脚本已完成其工作并且可能已经退出。

运行启动脚本后,将创建一个新的 Django 进程。在您的机器上进行实验并找到它的名称。然后,您可以在程序中运行类似 sudo Killall django_process 的内容。

关于Python 使用 subprocess.Popen 关闭所有线程或进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35988923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com