这个问题在这里已有答案:
我想知道我系统的当前IP地址。到目前为止,我无法为我的设备找到任何解决方案。我尝试过socket.gethostbyname(socket.gethostname())
方法,但它正在回归我127.0.0.1
。
是否有任何Python包可以在Ubuntu和Linux中运行良好?
请记住,您的系统可以在许多接口上具有多个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'
这可能是您正在寻找的价值。
你可以用Python做一个bash调用:
import os
os.system('ipconfig')
或者使用子流程
cmd = 'ipconfig'
results = subprocess.run(
cmd, shell=True, universal_newlines=True, check=True)
print(results.stdout)