trae开发的win10端口占用检测工具
生活随笔
收集整理的這篇文章主要介紹了
trae开发的win10端口占用检测工具
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
首先,強烈安利字節開發的工具:https://www.trae.com.cn/ 以下代碼均由此工具生成。
linux 中可以使用 lsof -i:端口號 查看端口占用進程,并使用kill指令殺死進程,但是對于不熟悉windows命令行的同學,
如果運行代碼時,一直提示某個端口被占用,使用netstat -ano|findstr LISTEN 雖然也可以查到端口占用進程,但是taskkill 指令還是挺麻煩的。
下面是用trae開發的基于python wxpython庫的端口占用檢測界面工具。
正文
- 主程序 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()
- 編譯成二進制腳本
這里使用了 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
- 運行
直接python腳本運行
python port_monitor.py
exe運行
port_monitor.exe
運行效果展示:
總結
以上是生活随笔為你收集整理的trae开发的win10端口占用检测工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ElementUI默认样式修改
- 下一篇: JuiceFS v1.3-beta1:新