• Python学习(6)--获取windows本地网卡和地址信息(1)


    1. 简述

    按照我的预想,我要做一个发包工具。发包的话就需要知道包从电脑的哪个接口发出去,所以在初始化工具的时候需要知道当前电脑的网卡状态及网卡信息。

    这次学习主要是读取PC的网卡及设备信息。

    通过本次学习可以了解到如下知识点:

    1. 新的Python延展库netifaces
    2. Python自带的标准库winreg包和re包
    3. Python自带的标准库subprocess
    4. Python数据类型,数据字典的用法
    5. 两个获取window本地网卡和地址信息的方法

    2. netifaces

    通过Python的netifaces模块,可以很容易的获取ip,路由、网关等信息

    使用pip install netifaces 安装或者去官网下载,netifaces · PyPI

    使用如下代码可以查看netifaces的属性和方法。

    1. import netifaces
    2. print(help(netifaces))
    1. Help on module netifaces:
    2. NAME
    3. netifaces
    4. FUNCTIONS
    5. gateways(...)
    6. Obtain a list of the gateways on this machine.
    7. Returns a dict whose keys are equal to the address family constants,
    8. e.g. netifaces.AF_INET, and whose values are a list of tuples of the
    9. format (
      , <interface>, ).
    10. There is also a special entry with the key 'default', which you can use
    11. to quickly obtain the default gateway for a particular address family.
    12. There may in general be multiple gateways; different address
    13. families may have different gateway settings (e.g. AF_INET vs AF_INET6)
    14. and on some systems it's also possible to have interface-specific
    15. default gateways.
    16. ifaddresses(...)
    17. Obtain information about the specified network interface.
    18. Returns a dict whose keys are equal to the address family constants,
    19. e.g. netifaces.AF_INET, and whose values are a list of addresses in
    20. that family that are attached to the network interface.
    21. interfaces(...)
    22. Obtain a list of the interfaces available on this machine.
    23. DATA
    24. AF_12844 = 25
    25. AF_APPLETALK = 16
    26. AF_ATM = 22
    27. AF_BAN = 21
    28. AF_CCITT = 10
    29. AF_CHAOS = 5
    30. AF_CLUSTER = 24
    31. AF_DATAKIT = 9
    32. AF_DECnet = 12
    33. AF_DLI = 13
    34. AF_ECMA = 8
    35. AF_FIREFOX = 19
    36. AF_HYLINK = 15
    37. AF_IMPLINK = 3
    38. AF_INET = 2
    39. AF_INET6 = 23
    40. AF_IPX = 6
    41. AF_IRDA = 26
    42. AF_ISO = 7
    43. AF_LAT = 14
    44. AF_LINK = -1000
    45. AF_NETBIOS = 17
    46. AF_NETDES = 28
    47. AF_NS = 6
    48. AF_PUP = 4
    49. AF_SNA = 11
    50. AF_UNIX = 1
    51. AF_UNKNOWN1 = 20
    52. AF_UNSPEC = 0
    53. AF_VOICEVIEW = 18
    54. address_families = {-1000: 'AF_LINK', 0: 'AF_UNSPEC', 1: 'AF_UNIX', 2:...
    55. version = '0.11.0'
    56. FILE
    57. c:\program files\python37\lib\site-packages\netifaces.cp37-win_amd64.pyd

    3. subprocess

    subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。

    可以使用上节给的方法查看他的属性和方法。

    常用的方法是run和popen。

    下面是个在windows下执行ipconfig的代码。其中需要注意的是:

    1. universal_newlines=True和encoding='CP936'效果一样,如果没有这个话打印出来的编码格式可能是乱码。
    2. q和p是不同的对象,也就是说run和Popen方法会返回不同的对象,所以你想得到预期的打印就得使用不同的方法
    1. import subprocess
    2. q = subprocess.run('ipconfig', stdout=subprocess.PIPE, universal_newlines=True)
    3. print(q.stdout)
    4. print('-------------------------------------------------------')
    5. p = subprocess.Popen('ipconfig', shell=True, stdout=subprocess.PIPE, encoding='CP936')
    6. p.wait()
    7. res = "".join(p.stdout.readlines())
    8. print(p.stdout)
    9. print(res)

    结果:

    1. Windows IP 配置
    2. 以太网适配器 本地连接 3:
    3. 连接特定的 DNS 后缀 . . . . . . . :
    4. 本地链接 IPv6 地址. . . . . . . . : fe80::757d:c87c:6656:f0cf%17
    5. IPv4 地址 . . . . . . . . . . . . : 192.168.10.28
    6. 子网掩码 . . . . . . . . . . . . : 255.255.255.0
    7. 默认网关. . . . . . . . . . . . . :
    8. 以太网适配器 本地连接:
    9. 连接特定的 DNS 后缀 . . . . . . . :
    10. IPv4 地址 . . . . . . . . . . . . : 192.168.206.28
    11. 子网掩码 . . . . . . . . . . . . : 255.255.255.0
    12. 默认网关. . . . . . . . . . . . . : 192.168.206.1
    13. 隧道适配器 Teredo Tunneling Pseudo-Interface:
    14. 媒体状态 . . . . . . . . . . . . : 媒体已断开
    15. 连接特定的 DNS 后缀 . . . . . . . :
    16. -------------------------------------------------------
    17. <_io.TextIOWrapper name=3 encoding='CP936'>
    18. Windows IP 配置
    19. 以太网适配器 本地连接 3:
    20. 连接特定的 DNS 后缀 . . . . . . . :
    21. 本地链接 IPv6 地址. . . . . . . . : fe80::757d:c87c:6656:f0cf%17
    22. IPv4 地址 . . . . . . . . . . . . : 192.168.10.28
    23. 子网掩码 . . . . . . . . . . . . : 255.255.255.0
    24. 默认网关. . . . . . . . . . . . . :
    25. 以太网适配器 本地连接:
    26. 连接特定的 DNS 后缀 . . . . . . . :
    27. IPv4 地址 . . . . . . . . . . . . : 192.168.206.28
    28. 子网掩码 . . . . . . . . . . . . : 255.255.255.0
    29. 默认网关. . . . . . . . . . . . . : 192.168.206.1
    30. 隧道适配器 Teredo Tunneling Pseudo-Interface:
    31. 媒体状态 . . . . . . . . . . . . : 媒体已断开
    32. 连接特定的 DNS 后缀 . . . . . . . :

    4. winreg

    python winreg是python的一个标准库,用来对windows注册表的操作

    我这里用它主要是因为windows下使用netiface模块的interfaces()函数不能拿到网卡名称(真正的名称),只能拿到一串奇怪的数字{95896FC1-9EC4-407E-89D7-A7007AE80D98}。需要将这串数字变成真正的网卡名称,就需要用到windows注册表

    5. re

    python re模块称为正则表达式;

    基本和常用正则符号的含义如下:

    正则符号正则含义
    \d匹配所有的十进制数字  0-9
    \D匹配所有的非数字,包含下划线
    \s匹配所有空白字符(空格、TAB等)
    \S匹配所有非空白字符,包含下划线
    \w匹配所有字母、汉字、数字    a-z A-Z 0-
    \W匹配所有非字母、汉字、数字,包含下划线
    $匹配一行的结尾(必须放在正则表达式最后面)
    ^匹配一行的开头(必须放在正则表达式最前面)
    *前面的字符可以出现0次或多次(0~无限)
    +前面的字符可以出现1次或多次(1~无限)
    变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次
    .匹配除了换行符"\n"之外的任意单个字符
    |两项都进行匹配
    [ ]    代表一个集合,有如下三种情况
    [abc]    能匹配其中的单个字符
    [a-z0-9] 能匹配指定范围的字符,可取反(在最前面加入^)
    [2-9] [1-3]能够做组合匹配
    { }用于标记前面的字符出现的频率,有如下情况:
    {n,m}代表前面字符最少出现n次,最多出现m次
    {n,}代表前面字符最少出现n次,最多不受限制
    {,m}代表前面字符最多出现n次,最少不受限制
    {n}前面的字符必须出现n次                           
  • 相关阅读:
    【老生谈算法】matlab算法离合器——离合器
    CMT2380F32模块开发9-可编程计数阵列 PCA例程
    Spring Boot(六十八):SpringBoot 整合Apache tika 实现文档内容解析
    30 位学者合力发表 Nature 综述,10 年回顾解构 AI 如何重塑科研范式
    46-3 护网溯源 - 溯源报告编写
    在C++程序中给视频添加文字水印
    币安领投元宇宙游戏项目Ultiverse最全教程
    IPWorks Zip Delphi 流式压缩组件
    人工智能三要素之算法Transformer
    C语言回调函数到底是怎么回事?
  • 原文地址:https://blog.csdn.net/monkeyzh123/article/details/126291890