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中的Cookie模块使用
Jul 06 Python
Python-嵌套列表list的全面解析
Jun 08 Python
详解appium+python 启动一个app步骤
Dec 20 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
django用户登录验证的完整示例代码
Jul 21 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 Python
详解python with 上下文管理器
Sep 02 Python
python中append函数用法讲解
Dec 11 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 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
apache rewrite_module模块使用教程
2008/01/10 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
vue数据双向绑定原理解析(get &amp; set)
2017/03/08 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
Python中的探索性数据分析(功能式)
2017/12/22 Python
django query模块
2019/04/20 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
基于FME使用Python过程图解
2020/05/13 Python
python中的yield from语法快速学习
2020/11/06 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
销售工作人员的自我评价分享
2013/11/10 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
经典婚礼主持词
2014/03/13 职场文书
机关单位动员会主持词
2014/03/20 职场文书
争先创优演讲稿
2014/09/15 职场文书
乡镇群众路线教育实践活动整改措施
2014/10/04 职场文书
2014年实习生工作总结
2014/11/27 职场文书
文艺演出主持词
2015/07/01 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书