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中实现单例模式的三种方法
Apr 08 Python
Python类属性的延迟计算
Oct 22 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
TensorFlow实现创建分类器
Feb 06 Python
Python实现的堆排序算法示例
Apr 29 Python
完美解决python3.7 pip升级 拒绝访问问题
Jul 12 Python
python 日志 logging模块详细解析
Mar 31 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
Python远程linux执行命令实现
Nov 11 Python
pycharm如何设置官方中文(如何汉化)
Dec 29 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
PHP生成Flash动画的实现代码
2010/03/12 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
JS实现页面打印(整体、局部)
2017/08/18 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python类的用法实例浅析
2015/05/27 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
教师师德教育的自我评价
2013/10/31 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
小学生差生评语
2014/12/29 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang