日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

trae开发的win10端口占用检测工具

發布時間:2025/5/22 编程问答 16 如意码农
生活随笔 收集整理的這篇文章主要介紹了 trae开发的win10端口占用检测工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言


首先,強烈安利字節開發的工具:https://www.trae.com.cn/ 以下代碼均由此工具生成。

linux 中可以使用 lsof -i:端口號 查看端口占用進程,并使用kill指令殺死進程,但是對于不熟悉windows命令行的同學,

如果運行代碼時,一直提示某個端口被占用,使用netstat -ano|findstr LISTEN 雖然也可以查到端口占用進程,但是taskkill 指令還是挺麻煩的。

下面是用trae開發的基于python wxpython庫的端口占用檢測界面工具。

正文


  1. 主程序 port_monitor.py
import wx
import subprocess
import re class PortMonitorFrame(wx.Frame):
def __init__(self, parent, title):
super(PortMonitorFrame, self).__init__(parent, title=title, size=(600, 400))
self.InitUI()
self.Centre()
self.is_scanning = False def InitUI(self):
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.port_input = wx.TextCtrl(panel)
hbox1.Add(wx.StaticText(panel, label='端口號:'), flag=wx.RIGHT, border=8)
hbox1.Add(self.port_input, proportion=1) hbox2 = wx.BoxSizer(wx.HORIZONTAL)
self.check_btn = wx.Button(panel, label='檢測端口占用')
self.kill_btn = wx.Button(panel, label='終止占用進程')
self.check_btn.Bind(wx.EVT_BUTTON, self.on_check_port)
self.kill_btn.Bind(wx.EVT_BUTTON, self.on_kill_process)
hbox2.Add(self.check_btn, flag=wx.RIGHT, border=8)
hbox2.Add(self.kill_btn) self.result_list = wx.ListCtrl(panel, style=wx.LC_REPORT)
self.result_list.InsertColumn(0, 'PID', width=100)
self.result_list.InsertColumn(1, '程序名稱', width=200)
self.result_list.InsertColumn(2, '狀態', width=150)
self.result_list.InsertColumn(3, '是否為主程序', width=100)
self.result_list.InsertColumn(4, '程序路徑', width=250) vbox.Add(hbox1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10)
vbox.Add(hbox2, flag=wx.EXPAND|wx.ALL, border=10)
vbox.Add(self.result_list, proportion=1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, border=10) panel.SetSizer(vbox) def on_check_port(self, event):
port = self.port_input.GetValue().strip()
if not port.isdigit():
wx.MessageBox('請輸入有效的端口號', '錯誤', wx.ICON_ERROR)
return if self.is_scanning:
wx.MessageBox('掃描正在進行中', '提示', wx.ICON_INFORMATION)
return self.result_list.DeleteAllItems()
self.is_scanning = True
wx.CallAfter(self.check_btn.Enable, False) def scan_task():
try:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
output = subprocess.check_output(['netstat', '-ano'], text=True, stderr=subprocess.STDOUT, startupinfo=startupinfo)
pattern = re.compile(r'TCP\s+.*?:{}\s+.*?\s+(\d+)'.format(port))
pids = pattern.findall(output) if not pids:
wx.CallAfter(wx.MessageBox, '端口未被占用', '提示', wx.ICON_INFORMATION)
else:
for pid in set(pids):
if not self.is_scanning: # 掃描被中斷時退出循環
break
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
task_info = subprocess.check_output(['tasklist', '/fi', f'pid eq {pid}'], text=True, stderr=subprocess.STDOUT, startupinfo=startupinfo)
proc_name = re.search(r'(.+?)\s+\d+\s+Console', task_info)
proc_name = proc_name.group(1).strip() if proc_name else '未知程序'
# 解析netstat輸出獲取PID對應的連接狀態
pattern_detail = re.compile(r'TCP\s+.*?:{}\s+.*?\s+(\S+)\s+({})'.format(port, pid))
status_match = pattern_detail.search(output)
is_listening = status_match.group(1) == 'LISTENING' if status_match else False def update_ui(pid, proc_name, is_listening, proc_path):
index = self.result_list.InsertItem(self.result_list.GetItemCount(), pid)
self.result_list.SetItem(index, 1, proc_name)
self.result_list.SetItem(index, 2, '運行中')
self.result_list.SetItem(index, 3, '是' if is_listening else '')
self.result_list.SetItem(index, 4, proc_path)
if is_listening:
self.result_list.SetItemTextColour(index, wx.RED) # 獲取程序路徑(使用wmic命令)
try:
proc_path_output = subprocess.check_output(['wmic', 'process', 'where', f'processid={pid}', 'get', 'executablepath'], text=True, stderr=subprocess.STDOUT, startupinfo=startupinfo)
proc_path_match = re.search(r'ExecutablePath\s+(.+?)\s*$', proc_path_output, re.MULTILINE)
proc_path = proc_path_match.group(1).strip() if proc_path_match else '未知路徑'
except:
proc_path = '未知路徑' wx.CallAfter(update_ui, pid, proc_name, is_listening, proc_path) except subprocess.CalledProcessError as e:
wx.CallAfter(wx.MessageBox, f'執行命令失敗:{e.output}', '錯誤', wx.ICON_ERROR)
finally:
self.is_scanning = False
wx.CallAfter(self.check_btn.Enable, True) import threading
threading.Thread(target=scan_task, daemon=True).start() def on_kill_process(self, event):
if self.is_scanning:
wx.MessageBox('掃描未完成,請稍后', '提示', wx.ICON_INFORMATION)
return selected = self.result_list.GetFirstSelected()
if selected == -1:
wx.MessageBox('請選擇要終止的進程', '提示', wx.ICON_INFORMATION)
return pid = self.result_list.GetItemText(selected)
try:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
output = subprocess.check_output(['taskkill', '/F', '/PID', pid], text=True, stderr=subprocess.STDOUT, startupinfo=startupinfo)
self.result_list.DeleteItem(selected)
wx.MessageBox('進程終止成功', '提示', wx.ICON_INFORMATION)
except subprocess.CalledProcessError as e:
wx.MessageBox(f'終止進程失敗:{e.output}', '錯誤', wx.ICON_ERROR) if __name__ == '__main__':
app = wx.App()
frame = PortMonitorFrame(None, '端口監控工具')
frame.Show()
app.MainLoop()
  1. 編譯成二進制腳本

這里使用了 nuitka 工具,將py腳本編譯成c++的可執行程序。也可以使用 pyinstaller (pyinstaller 編譯成的程序會在用戶目錄留下緩存文件)

pip install nuitka

批處理文件

build.bat

@echo off
nuitka --standalone --onefile --windows-console-mode=disable port_monitor.py
echo 打包完成,可執行文件在dist目錄下
pause

運行后,生成 port_monitor.exe

  1. 運行

直接python腳本運行

python port_monitor.py

exe運行

port_monitor.exe

運行效果展示:

總結

以上是生活随笔為你收集整理的trae开发的win10端口占用检测工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。