基于Python编写端口进程管理工具

 更新时间:2025年01月10日 08:40:44   作者:黑客白泽  
这篇文章主要为大家介绍了如何使用Python编写一个用于端口管理和进程管理的GUI工具,它可以显示当前系统上所有开放的端口信息,感兴趣的可以了解下

1. 简介

这是我用python写的一个用于端口管理和进程管理的GUI工具,它可以显示当前系统上所有开放的端口信息,并且允许用户对选中的进程进行操作(如结束进程、定位进程文件夹路径、复制相关信息到剪贴板等)。

具体的功能包括:

  • 获取系统的开放端口信息,包括端口号、进程名称、协议类型(TCP/UDP)和进程路径。
  • 支持端口号、进程名称、PID的搜索。
  • 提供右键菜单,可以执行结束进程、定位进程路径、复制信息等操作。
  • 支持表格视图的滚动,可以查看大量端口数据。
  • 支持数据刷新,更新显示系统当前开放的端口和进程。

关键功能解析

  • 获取本机开放的端口信息:
  • 使用 psutil.net_connections(kind=‘inet’) 获取当前的网络连接信息,筛选出状态为 LISTEN的连接(即开放的端口)。
  • 获取与端口相关的进程信息,包括 PID、进程名称、进程路径等。

搜索功能:

  • 可以通过端口号、进程名称或 PID 搜索对应的端口和进程。
  • 用户可以输入查询的内容,选择查询的类型,点击查询按钮后,展示匹配的端口信息。

右键菜单:

  • 右键点击某一行端口数据时,会弹出一个菜单,菜单中包含结束进程、定位进程文件夹路径、复制信息等选项。
  • 结束进程:通过 psutil.Process(pid).terminate() 来结束选中的进程。
  • 定位进程文件夹路径:使用 os.startfile() 打开进程所在的文件夹。
  • 复制到剪贴板:使用 pyperclip.copy() 将选中的信息复制到系统剪贴板。

UI界面:

使用 ttk.Treeview 控件显示端口信息表格,支持垂直和水平滚动条。

创建了输入框和下拉菜单,供用户选择查询类型并输入查询内容。

界面功能

端口表格显示:

显示端口的详细信息,包括 PID、协议类型(TCP/UDP)、端口号、进程名称和路径。

支持垂直和水平滚动条,方便查看长列表。

查询功能:

支持通过端口号、进程名称、PID查询端口信息。

提供搜索框和下拉选择框,方便用户选择查询类型。

右键菜单操作:

提供“结束进程”、“定位进程文件夹路径”、“复制信息”等选项。 刷新功能:

点击刷新按钮可以重新加载端口信息,确保数据是最新的。

2. 运行效果

3. 相关源码

import tkinter as tk
from tkinter import ttk, messagebox
import psutil
import os
import pyperclip  # 引入pyperclip模块用于复制到剪贴板

# 获取本机所有开放的端口及对应的进程信息
def get_open_ports():
    open_ports = []
    for conn in psutil.net_connections(kind='inet'):
        if conn.status != 'LISTEN':
            continue
        
        pid = conn.pid
        if conn.type == 1:  # TCP协议
            protocol = 'TCP'
        elif conn.type == 2:  # UDP协议
            protocol = 'UDP'
        else:
            protocol = 'N/A'
        
        try:
            process = psutil.Process(pid)
            process_name = process.name()
            exe_path = process.exe()
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            process_name = "N/A"
            exe_path = "N/A"
        
        open_ports.append({
            'Port': conn.laddr.port,
            'PID': pid,
            'Process Name': process_name,
            'Protocol': protocol,
            'Path': exe_path
        })
    
    return open_ports

# 根据端口号查询对应进程的信息
def search_by_port(port):
    open_ports = get_open_ports()
    for port_info in open_ports:
        if port_info['Port'] == port:
            return port_info
    return None

# 根据进程名称查询对应的端口信息
def search_by_process_name(name):
    open_ports = get_open_ports()
    result = []
    for port_info in open_ports:
        if name.lower() in port_info['Process Name'].lower():
            result.append(port_info)
    return result

# 根据PID查询对应的端口信息
def search_by_pid(pid):
    open_ports = get_open_ports()
    for port_info in open_ports:
        if port_info['PID'] == pid:
            return port_info
    return None

# 更新UI中的端口列表
def update_port_list():
    for row in treeview.get_children():
        treeview.delete(row)

    open_ports = get_open_ports()

    if not open_ports:
        messagebox.showinfo("没有找到端口", "没有开放的端口或无法获取端口信息。")
        return
    
    for port_info in open_ports:
        treeview.insert('', 'end', values=(port_info['PID'], port_info['Protocol'], port_info['Port'], port_info['Process Name'], port_info['Path']))

# 根据选择的搜索类型执行相应的搜索
def search_selected_item():
    selected_type = combobox_search_type.get()
    search_value = entry_search_value.get()

    # 清空列表
    for row in treeview.get_children():
        treeview.delete(row)

    if selected_type == "端口号":
        try:
            port = int(search_value)
            port_info = search_by_port(port)
            if port_info:
                treeview.insert('', 'end', values=(port_info['PID'], port_info['Protocol'], port_info['Port'], port_info['Process Name'], port_info['Path']))
            else:
                messagebox.showinfo("未找到", f"未找到端口 {port} 对应的进程。")
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的端口号。")
    elif selected_type == "进程名称":
        result = search_by_process_name(search_value)
        if result:
            for port_info in result:
                treeview.insert('', 'end', values=(port_info['PID'], port_info['Protocol'], port_info['Port'], port_info['Process Name'], port_info['Path']))
        else:
            messagebox.showinfo("未找到", f"未找到进程名称包含 {search_value} 的记录。")
    elif selected_type == "PID":
        try:
            pid = int(search_value)
            port_info = search_by_pid(pid)
            if port_info:
                treeview.insert('', 'end', values=(port_info['PID'], port_info['Protocol'], port_info['Port'], port_info['Process Name'], port_info['Path']))
            else:
                messagebox.showinfo("未找到", f"未找到PID {pid} 对应的进程。")
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的PID。")

# 结束进程
def kill_process(pid):
    try:
        process = psutil.Process(pid)
        process.terminate()  # 发送 terminate 信号
        process.wait()  # 等待进程结束
        messagebox.showinfo("结束进程", f"进程 (PID: {pid}) 已被成功结束。")
    except (psutil.NoSuchProcess, psutil.AccessDenied):
        messagebox.showerror("错误", "无法结束该进程,可能没有权限。")

# 定位进程文件夹路径
def open_process_folder(exe_path):
    if exe_path and os.path.exists(exe_path):
        folder_path = os.path.dirname(exe_path)
        os.startfile(folder_path)  # 打开文件夹
    else:
        messagebox.showerror("错误", "无法找到进程文件路径。")

# 复制到剪贴板的功能
def copy_to_clipboard(text):
    pyperclip.copy(text)  # 使用 pyperclip 库复制文本
    messagebox.showinfo("复制成功", "内容已复制到剪贴板")

# 添加右键菜单
def on_right_click(event):
    selected_item = treeview.selection()
    if selected_item:
        pid = treeview.item(selected_item)['values'][0]  # 获取PID(现在第一列是PID)
        port = treeview.item(selected_item)['values'][2]  # 获取端口
        process_name = treeview.item(selected_item)['values'][3]  # 获取进程名称
        exe_path = treeview.item(selected_item)['values'][4]  # 获取路径
        menu = tk.Menu(root, tearoff=0)
        menu.add_command(label="结束进程", command=lambda: kill_process(int(pid)))
        menu.add_command(label="定位进程文件夹路径", command=lambda: open_process_folder(exe_path))
        menu.add_command(label="复制PID", command=lambda: copy_to_clipboard(pid))
        menu.add_command(label="复制端口号", command=lambda: copy_to_clipboard(port))
        menu.add_command(label="复制进程名称", command=lambda: copy_to_clipboard(process_name))
        menu.add_command(label="复制相关路径", command=lambda: copy_to_clipboard(exe_path))
        menu.post(event.x_root, event.y_root)

# 创建GUI界面
root = tk.Tk()
root.title("端口进程管理工具")  # 更新窗口标题
root.geometry("968x699")

# 创建并配置表格
columns = ("PID", "协议", "端口", "进程名称", "相关路径")  # 更新列顺序
treeview = ttk.Treeview(root, columns=columns, show='headings', height=25)
treeview.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

# 设置表头并使内容居中显示
for col in columns:
    treeview.heading(col, text=col)
    if col in ["PID", "协议", "端口"]:  # 设置PID、协议、端口列的宽度为固定10
        treeview.column(col, width=10, anchor='center')
    else:  # 其他列自动扩展
        treeview.column(col, anchor='center')

# 创建滚动条
scrollbar_y = ttk.Scrollbar(root, orient="vertical", command=treeview.yview)
scrollbar_y.pack(side="right", fill="y")
treeview.configure(yscrollcommand=scrollbar_y.set)

scrollbar_x = ttk.Scrollbar(root, orient="horizontal", command=treeview.xview)
scrollbar_x.pack(side="bottom", fill="x")
treeview.configure(xscrollcommand=scrollbar_x.set)

# 创建搜索框和按钮
frame_search = tk.Frame(root)
frame_search.pack(pady=10, fill=tk.X)

# 下拉选择框 - 选择搜索类型
label_search_type = tk.Label(frame_search, text="选择搜索类型:")
label_search_type.pack(side=tk.LEFT, padx=5)
combobox_search_type = ttk.Combobox(frame_search, values=["端口号", "进程名称", "PID"], width=15)
combobox_search_type.pack(side=tk.LEFT, padx=5)
combobox_search_type.set("端口号")  # 设置默认选项

# 输入框 - 根据选择的搜索类型输入相应内容
label_search_value = tk.Label(frame_search, text="输入查询内容:")
label_search_value.pack(side=tk.LEFT, padx=5)
entry_search_value = tk.Entry(frame_search, width=20)
entry_search_value.pack(side=tk.LEFT, padx=5)

# 查询按钮 - 设置不同尺寸
search_button = tk.Button(frame_search, text="查  询", width=18, height=1, command=search_selected_item)
search_button.pack(side=tk.LEFT, padx=15)

# 刷新按钮 - 设置不同尺寸
refresh_button = tk.Button(frame_search, text="刷新列表", width=18, height=1, command=update_port_list)
refresh_button.pack(side=tk.RIGHT, padx=15, expand=True)

# 初始化时更新端口信息
update_port_list()

# 绑定右键菜单
treeview.bind("<Button-3>", on_right_click)

root.mainloop()

以上就是基于Python编写端口进程管理工具的详细内容,更多关于Python端口进程管理工具的资料请关注脚本之家其它相关文章!

相关文章

  • Python matplotlib中更换画布背景颜色的3种方法

    Python matplotlib中更换画布背景颜色的3种方法

    这篇文章主要给大家介绍了关于Python matplotlib中更换画布背景颜色的3种方法,在Matplotlib中,我们可以使用set_facecolor()方法来设置背景颜色,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Python使用Matplotlib将爬取的CSV数据变成直观图表

    Python使用Matplotlib将爬取的CSV数据变成直观图表

    当你在电商网站爬取了10万条商品价格数据,或是从气象站抓取了3年的温度记录,面对密密麻麻的CSV表格时,是否感到无从下手,本文将带你完成一个完整的数据可视化实战:从爬取某招聘网站的职位信息,到用Matplotlib生成专业图表,需要的朋友可以参考下
    2025-10-10
  • wxpython自定义下拉列表框过程图解

    wxpython自定义下拉列表框过程图解

    这篇文章主要介绍了wxpython自定义下拉列表框过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python不同版本实现配置文件加密

    Python不同版本实现配置文件加密

    这篇文章主要为大家详细介绍了Python不同版本下实现配置文件加密的示例代码,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01
  • NumPy索引介绍之数组的索引和切片用法

    NumPy索引介绍之数组的索引和切片用法

    NumPy的数组对象可以使用索引进行访问,支持基本切片、高级索引和字段访问,基本切片拓展到多维,但返回视图而非副本,高级索引通过整数和布尔索引实现,使用对象是布尔类型时也会进行高级索引,字段索引适用于结构化数组
    2026-05-05
  • Python3.5面向对象编程图文与实例详解

    Python3.5面向对象编程图文与实例详解

    这篇文章主要介绍了Python3.5面向对象编程,结合图文与实例形式详细分析了Python面向对象编程相关的概念、类定义、实例化、实例变量、类变量、析构函数等相关原理及使用技巧,需要的朋友可以参考下
    2019-04-04
  • 关于numpy.array的shape属性理解

    关于numpy.array的shape属性理解

    这篇文章主要介绍了关于numpy.array的shape属性理解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python实现List列表去重的五种方案

    Python实现List列表去重的五种方案

    本文详细介绍了Python中列表去重的多种方法,包括list(set(lst))、dict.fromkeys(lst)、列表推导式、pandas.Series.drop_duplicates()和sorted(list(groupby(lst)))等,并分析了它们的底层原理和效率差异,需要的朋友可以参考下
    2025-12-12
  • python使用Word2Vec进行情感分析解析

    python使用Word2Vec进行情感分析解析

    这篇文章主要介绍了python使用Word2Vec进行情感分析解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python成功解决读文件出现:IOError: [Errno 0] Error的错误

    Python成功解决读文件出现:IOError: [Errno 0] Error的错误

    在Python编程中,处理文件是常见的任务之一,但偶尔也会遇到各种错误,包括IOError,尽管Python 3.x中IOError已被OSError和FileNotFoundError等更具体的异常所取代,由于[Errno 0]不直接指向具体的错误类型,我们将讨论一系列可能导致IOError的常见情况,需要的朋友可以参考下
    2024-07-07

最新评论