当前位置: 首页 > article >正文

用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


http://www.kler.cn/a/287059.html

相关文章:

  • WebSocket 和 Socket 的区别
  • pip 相关
  • MIAOYUN信创云原生项目亮相西部“中试”生态对接活动
  • 【22】Word:小李-高新技术企业政策❗
  • C语言内存之旅:从静态到动态的跨越
  • Unity Shader学习日记 part5 CG基础
  • 蓝色炫酷碎粒子HTML5导航源码
  • (11)电调和电机
  • OSI七层网络协议
  • OceanBase 功能解析之 Binlog Service
  • 微信小程序引入unocss
  • 回溯——4.分割回文串
  • 【C++11及其特性】智能指针——auto_ptr
  • Java Operator SDK
  • YarnClient发送和接收请求源码解析
  • 深度学习复盘与论文复现G 项目维护
  • NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版
  • 2024.9.1 Python,跳跃游戏,贪心算法,回溯算法复原 IP 地址,关于回溯过程中列表的[:]以及copy问题再讨论
  • Flowable之传阅功能实现
  • 今日算法:蓝桥杯基础题之“星期一”
  • easyExcel 单元格合并
  • C++开发基础之宏定义:入门、中级、高级用法示例解析
  • 计算机毕业设计选题推荐-体育馆场地预约系统-Java/Python项目实战
  • OpenHarmony开发:应用分层架构设计
  • 汽车免拆诊断案例 | 2012 款大众速腾车发动机偶尔抖动
  • 【Python机器学习】NLP词中的数学——齐普夫定律