如何用Python列出Windows系统上所有定义的IP地址?

1 投票
2 回答
1379 浏览
提问于 2025-04-18 17:24

在一台Windows 7的电脑上,我添加了一些虚拟IP地址,所以运行ipconfig命令后,输出结果如下:

Windows IP Configuration

Ethernet adapter LAN-Verbindung:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::2d27:f07a:a617:b01e%11
   IPv4 Address. . . . . . . . . . . : 172.16.5.23
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   IPv4 Address. . . . . . . . . . . : 172.16.5.161
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 172.16.5.162
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 172.16.5.163
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 172.16.5.1

Ethernet adapter VirtualBox Host-Only Network:

----

我想用标准的Python,也就是只用Python自带的库,来获取所有这些IPv4地址的列表。也就是说,我希望有一些Python代码能够返回以下信息:

172.16.5.23
172.16.5.161
172.16.5.162
172.16.5.163

我该如何用Python做到这一点?最好是一行代码就能搞定。

2 个回答

0

这段代码会让你看到ipconfig命令的输出结果:

import subprocess

(out, err) = subprocess.Popen(["ipconfig"], stdout=subprocess.PIPE, shell=True).communicate()

现在只需要处理一下这个字符串,把里面的IP地址提取出来,放到一个列表里。

2
import subprocess
import re
proc = subprocess.check_output("ipconfig" )
print "\n".join(re.findall(r"(?<=IPv4 Address. . . . . . . . . . . : )(\d+\.\d+\.\d+\.\d+)",proc))

这是一个例子:

s = """
Ethernet adapter LAN-Verbindung:
   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::2d27:f07a:a617:b01e%11
   IPv4 Address. . . . . . . . . . . : 172.16.5.23
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   IPv4 Address. . . . . . . . . . . : 172.16.5.161
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 172.16.5.162
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   IPv4 Address. . . . . . . . . . . : 172.16.5.163
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 172.16.5.1
   """
In [13]: print "\n".join(re.findall(r"(?<=IPv4 Address. . . . . . . . . . . : )(\d+\.\d+\.\d+\.\d+)",s))
172.16.5.23
172.16.5.161
172.16.5.162
172.16.5.163

撰写回答