2 回答
TA贡献2036条经验 获得超8个赞
请记住,您的系统可以具有多个IP地址,很多接口(这个,如果你正在使用的容器或虚拟机工作时尤其如此),所以你需要明确了解其想要的IP地址。
此外,如果您的设备通过某种类型的 NAT 运行,则可能有一个与您的设备关联的外部地址,该地址在您的任何接口上都不可见。
因此,如果您的问题没有得到澄清,就很难确切地知道您在寻找什么。出于此答案的目的,我假设您想要“与默认路由关联的接口上的第一个 IP 地址”。我们可以使用netifaces模块来帮助解决这个问题:
首先,我们需要默认接口的名称。我们可以使用该netifaces.gateways()方法来获取网关列表:
>>> import netifaces
>>> netifaces.gateways()
{'default': {2: (u'192.168.1.1', u'eth0')}, 2: [(u'192.168.1.1', u'eth0', True)]}
该default键表示我们的默认网关,并且键的值是一个字典,其中键是地址的家庭,所以要得到我们所需要的接口名称:
>>> netifaces.gateways()['default'][netifaces.AF_INET][1]
u'eth0'
获得默认接口的名称后,我们可以使用以下netifaces.interfaces()方法查找它:
>>> iface = netifaces.gateways()['default'][netifaces.AF_INET][1]
>>> netifaces.ifaddresses(iface)
{17: [{'broadcast': u'ff:ff:ff:ff:ff:ff', 'addr': u'64:00:6a:7d:06:1a'}], 2: [{'broadcast': u'192.168.1.255', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.24'}, {'broadcast': u'192.168.1.100', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.100'}, {'broadcast': u'192.168.1.101', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.101'}], 10: [{'netmask': u'ffff:ffff:ffff:ffff::/64', 'addr': u'fe80::5da1:2401:a725:d2e0%eth0'}]}
这为我们提供了一堆接口信息,再次以地址族为键。获取接口的第一个IP地址:
>>> netifaces.ifaddresses(iface)[netifaces.AF_INET][0]['addr']
u'192.168.1.24'
这可能就是您正在寻找的价值。
TA贡献1875条经验 获得超5个赞
您可以从 Python 进行 bash 调用:
import os
os.system('ipconfig')
或与子进程
cmd = 'ipconfig'
results = subprocess.run(
cmd, shell=True, universal_newlines=True, check=True)
print(results.stdout)
添加回答
举报