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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
python异步任务队列示例
Apr 01 Python
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
python Pillow图像处理方法汇总
Oct 16 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
python代码打印100-999之间的回文数示例
Nov 24 Python
pytorch锁死在dataloader(训练时卡死)
May 28 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中HTML标签过滤技巧
2014/01/07 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
js实现数字滚动特效
2019/12/16 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
python获取豆瓣电影简介代码分享
2014/01/16 Python
跟老齐学Python之Python安装
2014/09/12 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
python如何查看网页代码
2020/06/07 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
竞聘自述材料
2014/08/25 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
网络妈妈观后感
2015/06/08 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
用Python的绘图库(matplotlib)绘制小波能量谱
2021/04/17 Python