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中的自定义函数学习笔记
Sep 23 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
matplotlib作图添加表格实例代码
Jan 23 Python
Python lambda函数基本用法实例分析
Mar 16 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
python openpyxl使用方法详解
Jul 18 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
Jul 31 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
Python中zipfile压缩包模块的使用
May 14 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中static关键字以及与self关键字的区别
2015/07/01 PHP
PHP钩子实现方法解析
2019/05/21 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
vue.js  父向子组件传参的实例代码
2017/10/29 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
python中pygame模块用法实例
2014/10/09 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
python 计算文件的md5值实例
2017/01/13 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Python模块 _winreg操作注册表
2020/02/05 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
会计系中文个人求职信
2013/12/24 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
工作调动申请报告
2015/05/18 职场文书
电话营销开场白
2015/05/29 职场文书
初中家长意见
2015/06/03 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL