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 08 Python
import的本质解析
Oct 30 Python
3个用于数据科学的顶级Python库
Sep 29 Python
树莓派与PC端在局域网内运用python实现即时通讯
Jun 22 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
Python Web框架之Django框架Model基础详解
Aug 16 Python
Django实现文件上传和下载功能
Oct 06 Python
Python是什么 Python的用处
May 26 Python
Python定义一个函数的方法
Jun 15 Python
python 如何在测试中使用 Mock
Mar 01 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 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(5) 类和对象
2010/02/16 PHP
PHP的SQL注入过程分析
2012/01/06 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
2010/12/10 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
使用python实现扫描端口示例
2014/03/29 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
中职应届生会计求职信
2013/10/23 职场文书