python主要使用gethostbyname和gethostbyname_ex两个函数实现获取IP地址

两者区别

gethostbyname 返回的是 主机名 的IPv4 地址格式,如果传入的参数是IPv4 的地址格式,则返回值跟参数一样,这个函数不支持IPv6 的域名解析。

gethostbyname_ex 则是扩展后的接口,传入主机名,它能够返回一个三元组(主机名,域名列表,IP地址列表),这个函数同样不支持IPv6的域名解析。我们来看一下他们到底是怎么样使用的。

获取ip地址

方法一

#!/usr/bin/env ptyhon
#-*- coding:utf-8 -*-

import socket
ip = socket.gethostbyname(socket.gethostname())
print 'ip:',ip

#gethostbyname_ex方法得到的结果为本机所有信息,如果要取出详细的ip地址,使用循环取出
iplist = socket.gethostbyname_ex(socket.gethostname())
print 'iplist',iplist
for ip in iplist[2]:
    print 'ip_all:',ip

#实际上socket.gethostname()可以换成域名,比如'www.baidu.com',那么获取到的信息就是百度相关的
执行结果
>>> 
ip: 192.168.1.61
iplist: ('PC339', [], ['10.10.10.1', '169.254.179.1', '192.168.1.61'])
ip_all: 10.10.10.1
ip_all: 169.254.179.1
ip_all: 192.168.1.61

方法二

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import socket

myname = socket.getfqdn(socket.gethostname())
myaddr = socket.gethostbyname(myname)
print myaddr

执行结果
>>> 192.168.1.61

例子:获取本机外网地址

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import re
import socket

def get_localip():
    ipList = socket.gethostbyname_ex(socket.gethostname())
    for ip in ipList[2]:
        res = re.match(r'(^127..*$|^169..*$|^10..*$)', ip) #排除三个常见的地址
        if res == None:
            return ip

print get_localip()

执行结果
>>> 192.168.1.61
Last modification:February 21st, 2019 at 02:28 pm
If you think my article is useful to you, please feel free to appreciate