【Python】通過cmd的shell命令獲取局域網內所有IP、MAC地址,通過主機名獲取IP

【Python】通過cmd的shell命令獲取局域網內所有IP、MAC地址,通過主機名獲取IP

更新以gitee為準:
gitee

文章目錄

  • cmd命令獲取IP
  • ping主機名
  • 獲取IP的主機名
  • socket獲取當前網關
  • 運行效果
  • 附錄:列表的賦值類型和py打包
    • 列表賦值
      • BUG復現
      • 代碼改進
      • 優化
      • 總結
    • py打包

cmd命令獲取IP

通過cmd命令可以查看出自身ip、網關下的所有設備等
所用的命令有:

ipconfig/allarp -a
在這里插入圖片描述
其中 arp命令實際上是從網絡緩存區去讀取 如果重置了緩存區 則無法搜索到設備

故 可以通過ping命令將各個網關下的設備 然后再通過arp -a讀取即可

代碼層面上 可以通過多線程來加快ping的速度 同時也起到初步篩選作用

def ping_ip(ip):global current_ip_listtry:result = subprocess.run(['ping', '-n','3',ip], capture_output=True, text=True,creationflags=subprocess.CREATE_NO_WINDOW)if "TTL" in str(result.stdout):current_ip_list.append(ip)except:pass

同時 使用arp命令加強篩選

 result = subprocess.run(['arp', '-a'], capture_output=True, text=True,creationflags=subprocess.CREATE_NO_WINDOW)                      self.device_list = []li = (str(result).split(current_ip+" ---")[1].split(":")[0]).split("\\n")for i in li:if ip in i:match = re.search(r'(\d+\.\d+\.\d+\.\d+)\s+([0-9a-fA-F-]+)', i)if match:                       ip_addr, mac = match.groups()                               for j in current_ip_list:if j == ip_addr:                                mac = mac.upper()current_ip_list.remove(j)self.device_list.append([ip_addr,mac,'',''])break

代碼邏輯即為 讀取arp下的所有IP 然后篩選出正常通信的

ping主機名

通過ping命令可以獲取主機名對應的IP 但是只能返回一個IP(通常是最近的一個)

代碼實現如下:

result = subprocess.run(['ping', '-4','-n', '1', hostname],capture_output=True,text=True,creationflags=subprocess.CREATE_NO_WINDOW)# 匹配帶方括號的IP地址ip_match = re.search(r'\[([\d.]+)\]', result.stdout)if ip_match:ip = ip_match.group(1)self.text_area.insert(tk.END, f"解析成功: {hostname} -> {ip}\n")i=1else:# 備用匹配模式ip_match = re.search(r'\d+\.\d+\.\d+\.\d+', result.stdout)if ip_match:ip = ip_match.group()self.text_area.insert(tk.END, f"解析成功: {hostname} -> {ip}\n")i=1else:self.text_area.insert(tk.END, f"無法解析主機名: {hostname}\n")if i == 1:# 在表格中查找IPfound = Falsefor item in self.tree.get_children():if self.tree.item(item, 'values')[0] == ip:# 標紅匹配行self.tree.tag_configure('found', background='#ff9999')self.tree.item(item, tags=('found',))self.tree.see(item)  # 滾動到該行found = Truebreakif not found:# 插入新行(MAC設為未知)new_item = self.tree.insert('', 'end', values=(ip, "請重新掃描","",""),tags=('found',))self.tree.tag_configure('found', background='#ff9999')self.tree.see(new_item)  # 滾動到新條目

獲取IP的主機名

通過nbtstat -A命令可以獲取IP對應的主機名和工作組
對應代碼:

def ping_name(num,current_ip):global current_ip_nameip = current_ip_name[num][0]name = ""group = ""r_list = []flag = 0try:result = subprocess.run(['nbtstat', '-A',ip], capture_output=True, text=True,creationflags=subprocess.CREATE_NO_WINDOW)s = result.stdoutif current_ip not in s:returns_list = s.split("\n")for i in s_list:if current_ip in i:flag = 1if flag:                if "0.0.0.0" in i:breakif "<" in i:r_list.append(i.split("<")[0].replace(" ",""))if not r_list:returnname = r_list[0]for i in r_list:if i == name:continueelse:group = iif group == "":group = namecurrent_ip_name[num][2] = namecurrent_ip_name[num][3] = groupexcept:pass

socket獲取當前網關

在Python中可以直接通過socket獲取當前所有網卡鄂網關及自身IP地址
代碼為:

	def get_local_ip(self):try:ips = []# 獲取所有網絡接口的IPhostname = socket.gethostname()ip_list = socket.gethostbyname_ex(hostname)[2]# 新增UDP方式獲取的活動接口IPwith socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:s.connect(("8.8.8.8", 80))active_ip = s.getsockname()[0]if active_ip not in ip_list:ip_list.append(active_ip)# 篩選私有地址并排序for ip in sorted(ip_list, key=lambda x: x != active_ip):if any([ip.startswith('192.168.'),ip.startswith('10.'),(ip.startswith('172.') and 15 < int(ip.split('.')[1]) < 32)]):ips.append(ip)# 更新下拉框self.ip_combobox['values'] = ipsif ips:self.ip_combobox.set(ips[0])self.update_gateway()else:self.ip_label.config(text="No valid IP found")except Exception as e:self.text_area.insert(tk.END, f"Network detection failed: {str(e)}\n")

運行效果

tkinter直接封裝
在這里插入圖片描述

附錄:列表的賦值類型和py打包

列表賦值

BUG復現

閑來無事寫了個小程序 代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021@author: 16016
"""a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):for j in range(16):a_list[j]=str(a_list[j])+'_'+str(j)print("序號:",j)print('a_list:\n',a_list)c_list[j]=a_listprint('c_list[0]:\n',c_list[0])print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])# 寫入到Excel:
#print(c_list,'\n')    

我在程序中 做了一個16次的for循環 把列表a的每個值后面依次加上"_"和循環序號
比如循環第x次 就是把第x位加上_x 這一位變成x_x 我在輸出測試中 列表a的每一次輸出也是對的
循環16次后列表a應該變成[‘0_0’, ‘1_1’, ‘2_2’, ‘3_3’, ‘4_4’, ‘5_5’, ‘6_6’, ‘7_7’, ‘8_8’, ‘9_9’, ‘10_10’, ‘11_11’, ‘12_12’, ‘13_13’, ‘14_14’, ‘15_15’] 這也是對的

同時 我將每一次循環時列表a的值 寫入到空列表c中 比如第x次循環 就是把更改以后的列表a的值 寫入到列表c的第x位
第0次循環后 c[0]的值應該是[‘0_0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’] 這也是對的
但是在第1次循環以后 c[0]的值就一直在變 變成了c[x]的值
相當于把c_list[0]變成了c_list[1]…以此類推 最后得出的列表c的值也是每一項完全一樣
我不明白這是怎么回事
我的c[0]只在第0次循環時被賦值了 但是后面它的值跟著在改變

如圖:
在這里插入圖片描述
第一次老出bug 賦值以后 每次循環都改變c[0]的值 搞了半天都沒搞出來
無論是用appen函數添加 還是用二維數組定義 或者增加第三個空數組來過渡 都無法解決

代碼改進

后來在我華科同學的指導下 突然想到賦值可以賦的是個地址 地址里面的值一直變化 導致賦值也一直變化 于是用第二張圖的循環套循環深度復制實現了

代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021@author: 16016
"""a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):for j in range(16):a_list[j]=str(a_list[j])+'_'+str(j)print("序號:",j)print('a_list:\n',a_list)for i in range(16):c_list[j].append(a_list[i])print('c_list[0]:\n',c_list[0])print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])# 寫入到Excel:
print(c_list,'\n')    

解決了問題

在這里插入圖片描述

優化

第三次是請教了老師 用copy函數來賦真值

代碼如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021@author: 16016
"""a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):for j in range(16):a_list[j]=str(a_list[j])+'_'+str(j)print("序號:",j)print('a_list:\n',a_list)c_list[j]=a_list.copy()print('c_list[0]:\n',c_list[0])print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])# 寫入到Excel:
#print(c_list,'\n')    

同樣能解決問題
在這里插入圖片描述
最后得出問題 就是指針惹的禍!

a_list指向的是個地址 而不是值 a_list[i]指向的才是單個的值 copy()函數也是復制值而不是地址

如果這個用C語言來寫 就直觀一些了 難怪C語言是基礎 光學Python不學C 遇到這樣的問題就解決不了

C語言yyds Python是什么垃圾弱智語言

總結

由于Python無法單獨定義一個值為指針或者獨立的值 所以只能用列表來傳送
只要賦值是指向一個列表整體的 那么就是指向的一個指針內存地址 解決方法只有一個 那就是將每個值深度復制賦值(子列表內的元素提取出來重新依次連接) 或者用copy函數單獨賦值

如圖測試:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
部分代碼:

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 20 16:45:48 2021@author: 16016
"""def text1():A=[1,2,3]B=[[],[],[]]for i in range(len(A)):A[i]=A[i]+iB[i]=Aprint(B)def text2():A=[1,2,3]B=[[],[],[]]A[0]=A[0]+0B[0]=Aprint(B)A[1]=A[1]+1B[1]=Aprint(B)A[2]=A[2]+2B[2]=Aprint(B)if __name__ == '__main__':text1()print('\n')text2()

py打包

Pyinstaller打包exe(包括打包資源文件 絕不出錯版)

依賴包及其對應的版本號

PyQt5 5.10.1
PyQt5-Qt5 5.15.2
PyQt5-sip 12.9.0

pyinstaller 4.5.1
pyinstaller-hooks-contrib 2021.3

Pyinstaller -F setup.py 打包exe

Pyinstaller -F -w setup.py 不帶控制臺的打包

Pyinstaller -F -i xx.ico setup.py 打包指定exe圖標打包

打包exe參數說明:

-F:打包后只生成單個exe格式文件;

-D:默認選項,創建一個目錄,包含exe文件以及大量依賴文件;

-c:默認選項,使用控制臺(就是類似cmd的黑框);

-w:不使用控制臺;

-p:添加搜索路徑,讓其找到對應的庫;

-i:改變生成程序的icon圖標。

如果要打包資源文件
則需要對代碼中的路徑進行轉換處理
另外要注意的是 如果要打包資源文件 則py程序里面的路徑要從./xxx/yy換成xxx/yy 并且進行路徑轉換
但如果不打包資源文件的話 最好路徑還是用作./xxx/yy 并且不進行路徑轉換

def get_resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)

而后再spec文件中的datas部分加入目錄
如:

a = Analysis(['cxk.py'],pathex=['D:\\Python Test\\cxk'],binaries=[],datas=[('root','root')],hiddenimports=[],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)

而后直接Pyinstaller -F setup.spec即可

如果打包的文件過大則更改spec文件中的excludes 把不需要的庫寫進去(但是已經在環境中安裝了的)就行

這些不要了的庫在上一次編譯時的shell里面輸出
比如:
在這里插入圖片描述

在這里插入圖片描述
然后用pyinstaller --clean -F 某某.spec

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89534.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sky-take-out項目Mybatis的使用

分頁查詢public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());//下一條sql進行分頁&#xff0c;自動加入limit關鍵字分頁Page<Category> page categor…

H3CNE小小綜合實驗

實驗拓撲圖實驗需求 按照圖示配置IP地址在SW1和SW2之間配置鏈路聚合增加鏈路帶寬&#xff0c;提高可靠性PC5和PC6屬于VLAN10&#xff0c; PC7和PC8屬于VLAN20SW1和SW2屬于二層交換機&#xff0c;SW3為三層交換機&#xff08;VLAN100用于對接R4&#xff09;,在交換機之間相連的鏈…

IP協議深入理解

一、什么是ip協議?1.1、ip協議是網絡層協議&#xff0c;ip協議的本質工作是提供一種能力&#xff0c;把數據可靠的跨網絡從主機A送到主機B&#xff1b;1.2、什么是ip&#xff1f;ip目標網絡目標主機&#xff1b;畫圖圖解:如圖&#xff0c;當主機A想要把數據發給主機B時&#x…

接收表單數據:serialize()函數解析

一、form-serialize作用與引入 作用&#xff1a; form-serialize可以快速收集表單數據&#xff0c;按照使用者意愿轉化為對象或字符串輸出&#xff0c;以便于提交至服務器。 引入&#xff1a; form-serialize不是瀏覽器自帶的JS方法&#xff0c;而是第三方工具庫。可以直接通過…

vc配置使用預編譯

預編譯原理 stdafx.h中加入系統文件&#xff0c;減少cpp中對這些文件的解析&#xff0c;提高速度 stdafx.h 會把編譯的文件生成pch&#xff0c;后續解析頭文件直接調用pch里面的數據 配置 新建stdafx.h和stdafx.cpp文件 配置stdafx.cpp文件為/Yc 創建預編譯文件整個項目設置/Yc…

反射機制的登錄系統

一、實體層&#xff08;po層&#xff09; //UserInfo package com.hugeyurt.po;import java.sql.ResultSet; import java.sql.SQLException;public class UserInfo {private String userID;private String name;private int count;private Long errorTime;private String pwd;p…

裝飾器模式及優化

裝飾器模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許向一個現有的對象添加新的功能&#xff0c;同時又不改變其結構。這種模式創建了一個裝飾器類&#xff0c;用來包裝原有的類&#xff0c;并在保持類方法簽名完整性的前提下&#xff…

共指消解技術全解析:從語言學規則到深度學習(附論文精讀)

精讀威斯康星大學綜述《Coreference Resolution: A Survey》&#xff0c;揭秘NLP中"實體鏈接"的核心技術一、什么是共指消解&#xff1f;為什么它是NLP的基石&#xff1f;共指消解(Coreference Resolution) 旨在識別文本中指向同一實體的不同表述。例如&#xff1a;t…

git配置git commit -m “fix 11,22: 修改bugid為11,22“

文章目錄前言一、報錯提示二、實現1.commitlint.config.js規范配置2. **修改正則表達式**&#xff1a;3. **移除 scope-case 規則**&#xff1a;4. **增強自定義規則邏輯**&#xff1a;測試結果&#xff1a;正則表達式詳解&#xff1a;前言 提示&#xff1a;正常的配置git規范…

nastools繼任者?極空間部署影視自動化訂閱系統『MediaMaster』

nastools繼任者&#xff1f;極空間部署影視自動化訂閱系統『MediaMaster』 哈嘍小伙伴們好&#xff0c;我是Stark-C~ 對于我們NAS玩家來說&#xff0c;觀影總是大家繞不開的一個執念&#xff0c;并且為觀影的折騰大家也都是樂此不疲~ 曾經有一個非常絕絕子的觀影神器擺在我們…

題解:CF1690G Count the Trains

思路&#xff1a; 首先我們可以理清一下各種情況&#xff1a;1&#xff09;m可能為02&#xff09;一次操作時&#xff0c;只需要考慮每節火車的車頭。3&#xff09;當一節火車的速度降低時&#xff0c;只會影響它及它后面的車廂當m0時&#xff0c;我們可以記錄上一節車頭的速度…

CCF編程能力等級認證GESP—C++3級—20250628

CCF編程能力等級認證GESP—C3級—20250628單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;判斷題&#xff08;每題 2 分&#xff0c;共 20 分&#xff09;編程題 (每題 25 分&#xff0c;共 50 分)奇偶校驗分糖果單選題&#xff08;每題 2 分&#xff0c;共 30 分…

2G和3G網絡關閉/退網狀態(截止2025年7月)

從能打語音電話的2G&#xff0c;到能發彩信、聊QQ的3G&#xff0c;這兩項陪伴了我們數十年的通信技術&#xff0c;正在悄然退出歷史舞臺。近日&#xff0c;全球移動供應商協會&#xff08;GSA&#xff09;發布的《2025年7月2G和3G網絡關閉報告》顯示&#xff0c;全球已有超百個…

Day06_C語言網絡編程20250718mobus重點

01.思維導圖1 什么是 modbus他是一個在工控領域非常好用的通信寫 modbus協議本質上是一個 基于 tcp 協議二次封裝的一個協議 什么叫做基于tcp二次封裝的協議&#xff1a;我們自己寫的pack_t(無論靜態還是動態)&#xff0c;都是屬于二次封裝的協議modbus協議是一種 “主從問答式…

比亞迪古德伍德亮相:從技術突破到文化對話

近日&#xff0c;比亞迪攜騰勢Z9GT、方程豹豹5、騰勢D9亮相英國古德伍德速度節——全球最具聲望的汽車文化盛典。方程豹豹5搭載全球首個 DMO電驅越野平臺&#xff0c;在爬山賽道上展現出媲美性能跑車的動力響應與精準控制&#xff0c;徹底打破“越野必靠大排量燃油機”的西方傳…

UniApp TabBar 用戶頭像方案:繞過原生限制的實踐

需求場景&#xff1a; 在 UniApp 項目中&#xff0c;需要將 TabBar 首頁項 (index) 的圖標替換為當前用戶的網絡圖片&#xff0c;并實現&#xff1a; 放大且圓形顯示。點擊該圖標時&#xff0c;頁面滾動回頂部。切換到其他分類時&#xff0c;首頁 Tab 項恢復為普通首頁圖標。 嘗…

如何閱讀Spring源碼

如何閱讀Spring源碼 簡介 最近有許多人問我如何閱讀Spring源碼&#xff0c;那我便在這給出閱讀源碼的方法&#xff0c;能夠保證本地能夠讓源碼能夠運行起來。 Spring 源碼環境本地編譯 Gradle下載地址 通過網盤分享的文件&#xff1a;gradle-6.4.1-all.zip 鏈接: https://pan.b…

Excel導出實戰:從入門到精通 - 構建專業級數據報表的完整指南

文章目錄Excel導出實戰&#xff1a;從入門到精通 - 構建專業級數據報表的完整指南引言&#xff1a;ExcelJSFileSaver如何映射到Excel操作一、ExcelJS核心架構解析 - 從文件結構理解1. 工作簿(Workbook)模型 - 相當于整個Excel文件2. 工作表(Worksheet)配置 - 相當于單個工作表設…

PyTorch圖像預處理全解析(transforms)

1. 引言在深度學習計算機視覺任務中&#xff0c;數據預處理和數據增強是模型訓練的關鍵步驟&#xff0c;直接影響模型的泛化能力和最終性能表現。PyTorch 提供的 torchvision.transforms 模塊&#xff0c;封裝了豐富的圖像變換方法&#xff0c;能夠高效地完成圖像標準化、裁剪、…

slam中的eskf觀測矩陣推導

在之前的《slam中的eskf推導》一文中&#xff0c;沒有寫觀測矩陣 H 矩陣的過程&#xff0c;現在補上這部分。前置列舉幾個等下推導需要用到的一些點&#xff1a;平面特征點構造觀測矩陣例如在 fastlio 中&#xff0c;是利用平面特征點到擬合平面的距離來構造觀測方程&#xff0…