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 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
python编写弹球游戏的实现代码
Mar 12 Python
Python实现的端口扫描功能示例
Apr 08 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
python安装numpy和pandas的方法步骤
May 27 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
Python异常处理例题整理
Jul 07 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
python爬取王者荣耀全皮肤的简单实现代码
Jan 31 Python
python和C++共享内存传输图像的示例
Oct 27 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使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
php 实现进制相互转换
2016/04/07 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
python遍历数组的方法小结
2015/04/30 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
Python 性能优化技巧总结
2016/11/01 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
意大利拉斐尔时尚购物网:Raffaello Network(支持中文)
2018/11/09 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
材料成型专业个人求职信范文
2013/09/25 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
大一新生期末自我评价
2014/09/12 职场文书