用python启动nacos和redis
import subprocess
import tkinter as tk
from tkinter import ttk, messagebox
from subprocess import Popen, run, PIPE
# 启动Nacos的函数
def start_nacos():
startup_cmd_path = r'D:\environment\code-software\nacos-server-1.4.1\nacos\bin\startup.cmd'
# 异步启动Nacos
Popen([startup_cmd_path, '-m', 'standalone'])
messagebox.showinfo("Nacos状态", "Nacos 启动命令已发送,请检查Nacos是否已启动。")
# 启动Redis的函数
def start_redis():
Popen([r'D:\environment\redis\Redis-x64-5.0.14.1\redis-server.exe',
r'D:\environment\redis\Redis-x64-5.0.14.1\redis.windows.conf'])
messagebox.showinfo("Redis状态", "Redis启动命令已发送,请检查Redis是否已启动。")
# 查找指定端口占用的进程ID
def find_pid_by_port(port):
"""
通过端口号查找对应的进程ID(PID)
:param port: 要查找的端口号
:return: 端口对应的进程ID,如果找不到则返回None
"""
# 构造命令行命令,使用netstat -ano列出所有连接和侦听端口,然后通过findstr搜索指定端口
command = f"netstat -ano | findstr :{port}"
# 执行命令行命令,shell=True允许命令通过shell执行,stdout和stderr捕获输出,text=True确保输出为文本
result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 检查命令执行是否成功(即返回值是否为0),如果不成功(如找不到端口)则返回None
if result.returncode != 0:
return None
# 遍历命令输出的每一行
for line in result.stdout.split('\n'):
# 将每行按空格分割成多个部分
parts = line.split()
# 如果分割后的列表不为空,取最后一个元素作为可能的PID部分
# 如果列表为空,则pid_part设置为空字符串
pid_part = parts[-1] if parts else ''
# 检查pid_part是否全为数字且大于0,如果是,则返回该PID
if pid_part.isdigit() and int(pid_part) > 0:
return int(pid_part)
# 如果遍历完所有行都没有找到合适的PID,则返回None
return None
# 杀死指定PID的进程
def kill_process(pid):
command = f"taskkill /F /PID {pid}"
result = run(command, shell=True, stdout=PIPE, stderr=PIPE, text=True)
if result.returncode == 0:
return f"进程ID为 {pid} 的进程已成功被杀死。"
else:
return f"无法杀死进程ID为 {pid} 的进程: {result.stderr}"
# 按钮点击事件处理函数
def on_button_click():
"""
处理按钮点击事件,用于查找并可能杀死监听在指定端口上的进程。
"""
# 从某个GUI组件(如Entry小部件)中获取用户输入的端口号
port_input = port_entry.get()
try:
# 尝试将用户输入的字符串转换为整数
port = int(port_input)
# 调用find_pid_by_port函数查找端口对应的进程ID
pid = find_pid_by_port(port)
# 如果找到了进程ID
if pid:
# 调用kill_process函数尝试杀死该进程,并获取操作结果消息
message = kill_process(pid)
# 使用messagebox显示操作结果
messagebox.showinfo("进程操作结果", message)
else:
# 如果没有找到进程ID,显示消息框告知用户
messagebox.showinfo("未找到进程", f"没有找到监听在端口 {port} 上的进程。")
except ValueError:
# 如果在转换端口号时发生ValueError(即输入的不是有效的整数),显示错误消息
messagebox.showerror("输入错误", "请输入有效的端口号(整数)。")
# 主函数
def main():
root = tk.Tk()
root.title("服务启动器")
# 输入端口号的标签和输入框
label = tk.Label(root, text="请输入端口号:")
label.pack(pady=10)
global port_entry
port_entry = tk.Entry(root) # 使用局部变量,通过闭包在on_button_click中访问
port_entry.pack(pady=10)
# 杀死进程按钮
kill_button = tk.Button(root, text="杀死进程", command=on_button_click)
kill_button.pack(pady=10)
# 放置启动按钮的Frame
frame = ttk.Frame(root, padding="50 50 50 50")
frame.pack(pady=20)
# 启动Nacos和Redis的按钮
btn_start_nacos = ttk.Button(frame, text="启动Nacos", command=start_nacos)
btn_start_nacos.pack(side=tk.LEFT, padx=10, pady=10)
btn_start_redis = ttk.Button(frame, text="启动Redis", command=start_redis)
btn_start_redis.pack(side=tk.RIGHT, padx=10, pady=10)
# 尝试设置ttk主题
style = ttk.Style()
try:
style.theme_use('clam')
except tk.TclError:
print("主题clam不可用,使用默认主题。")
root.mainloop()
if __name__ == "__main__":
main()
打包成exe文件
命令:
pip install Pyinstaller
pyinstaller -F --noconsole .\你的文件名.py