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解析网页源代码中的115网盘链接实例
Sep 30 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
matplotlib绘图实例演示标记路径
Jan 23 Python
对python中的argv和argc使用详解
Dec 15 Python
Python 判断奇数偶数的方法
Dec 20 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
Django中的用户身份验证示例详解
Aug 07 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
python Protobuf定义消息类型知识点讲解
Mar 02 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使用ob_start生成html页面的方法
2014/11/07 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
2019/08/13 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
详解ES6中的let命令
2020/04/05 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
JavaScript 异步调用
2017/10/25 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
Vue之mixin全局的用法详解
2018/08/22 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
python web框架中实现原生分页
2019/09/08 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
军训的自我鉴定
2013/12/10 职场文书
室内设计专业个人的自我评价
2013/12/18 职场文书
汽车促销活动方案
2014/03/31 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
初中家长评语大全
2014/12/26 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
Echarts如何重新渲染实例详解
2022/05/30 Javascript