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 字符串操作实现代码(截取/替换/查找/分割)
Jun 08 Python
python实现多线程采集的2个代码例子
Jul 07 Python
跟老齐学Python之坑爹的字符编码
Sep 28 Python
python中__call__方法示例分析
Oct 11 Python
python多线程threading.Lock锁用法实例
Nov 01 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
flask应用部署到服务器的方法
Jul 12 Python
用python中的matplotlib绘制方程图像代码
Nov 21 Python
浅谈Tensorflow 动态双向RNN的输出问题
Jan 20 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
php封装的page分页类完整实例
2016/10/18 PHP
phpwind放自动注册方法
2006/12/02 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
python利用hook技术破解https的实例代码
2013/03/25 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python2包含中文报错的解决方法
2018/07/09 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
Python常用类型转换实现代码实例
2020/07/28 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
几个Shell Script面试题
2014/04/18 面试题
Delphi软件工程师试题
2013/01/29 面试题
环境科学专业大学生自荐信格式
2013/09/21 职场文书
公司营业员的工作总结自我评价
2013/10/05 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏