Python如何优雅获取本机IP方法


Posted in Python onNovember 10, 2019

见过很多获取服务器本地IP的代码,个人觉得都不是很好,例如以下这些

不推荐:靠猜测去获取本地IP方法

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

import socket
import fcntl
import struct

def get_ip_address(ifname):
  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  return socket.inet_ntoa(fcntl.ioctl(
    s.fileno(),
    0x8915, # SIOCGIFADDR
    struct.pack('256s', ifname[:15])
  )[20:24])

print "br1 = "+ get_ip_address('br1')
print "lo = " + get_ip_address('lo')
print "virbr0 = " + get_ip_address('virbr0')

这类代码带有猜测的行为。

如果机器上只有eth0 或者 只有bond0上有IP,那么此类代码都有可能失败,而且还不容易移植到其他平台上。

不推荐:通过hostname来获取本机IP

import socket
print(socket.gethostbyname(socket.gethostname()))

# 有可能出现这个情况
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known

这个方法是通过获取hostname,然后再通过hostname反查处机器的IP。这个方法也是不推荐的。因为很多的机器没有规范这个hostname的设置。

另外就是有些服务器会在 /etc/hosts 中添加本机的hostname的地址,这个做法也不是不可以,但是如果设置成了 127.0.0.1,那么获取出来的IP就都是这个地址了。

通过 UDP 获取本机 IP,目前见过最优雅的方法

这个方法是目前见过最优雅获取本机服务器的IP方法了。没有任何的依赖,也没有去猜测机器上的网络设备信息。

而且是利用 UDP 协议来实现的,生成一个UDP包,把自己的 IP 放如到 UDP 协议头中,然后从UDP包中获取本机的IP。

这个方法并不会真实的向外部发包,所以用抓包工具是看不到的。但是会申请一个 UDP 的端口,所以如果经常调用也会比较耗时的,这里如果需要可以将查询到的IP给缓存起来,性能可以获得很大提升。

# 在 shell 中可以一行调用,获取到本机IP
python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1])"
10.12.189.16

# 可以封装成函数,方便 Python 的程序调用
import socket

def get_host_ip():
  try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('8.8.8.8', 80))
    ip = s.getsockname()[0]
  finally:
    s.close()

  return ip

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python监视指定目录下文件变更的方法
Oct 15 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
Python input函数使用实例解析
Nov 22 Python
django自定义模板标签过程解析
Dec 14 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
Python实现EM算法实例代码
Oct 04 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 Python
Python将QQ聊天记录生成词云的示例代码
Feb 10 Python
python argparser的具体使用
Nov 10 #Python
python滑块验证码的破解实现
Nov 10 #Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 #Python
分享PyCharm的几个使用技巧
Nov 10 #Python
Python单元测试与测试用例简析
Nov 09 #Python
python自动化测试之异常及日志操作实例分析
Nov 09 #Python
Python多线程模块Threading用法示例小结
Nov 09 #Python
You might like
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
关于python写入文件自动换行的问题
2018/06/23 Python
PyQt5实现简易计算器
2020/05/30 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
python将数据插入数据库的代码分享
2020/08/16 Python
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
垂直极限观后感
2015/06/08 职场文书
圣诞晚会主持词
2015/07/01 职场文书