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 18 Python
Python使用random和tertools模块解一些经典概率问题
Jan 28 Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
基于python进行桶排序与基数排序的总结
May 29 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
python批量识别图片指定区域文字内容
Apr 30 Python
python实现最小二乘法线性拟合
Jul 19 Python
Python笔记之工厂模式
Nov 20 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
通过代码简单了解django model序列化作用
Nov 12 Python
Jupyter Notebook 远程访问配置详解
Jan 11 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
php设计模式 Visitor 访问者模式
2011/06/28 PHP
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
php ci框架验证码实例分析
2013/06/26 PHP
ThinkPHP3.2.2的插件控制器功能
2015/03/05 PHP
PHP获取文件行数的方法
2015/06/10 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
Python中的日期时间处理详解
2016/11/17 Python
Python读取word文本操作详解
2018/01/22 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
《花的勇气》教后反思
2014/02/12 职场文书
法人委托书的范本格式
2014/09/11 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
云冈石窟导游词
2015/02/04 职场文书
2016春节慰问信范文
2015/03/25 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
篮球拉拉队口号
2015/12/25 职场文书