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实现dict版图遍历示例
Feb 19 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
Django中的文件的上传的几种方式
Jul 23 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
django 类视图的使用方法详解
Jul 24 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
python_mask_array的用法
Feb 18 Python
python如何爬取动态网站
Sep 09 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP中文编码小技巧
2014/12/25 PHP
php创建多级目录的方法
2015/03/24 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
使用jquery实现简单的ajax
2013/07/08 Javascript
通过js简单实现将一个文本内容转译成加密文本
2013/10/22 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
使用python实现扫描端口示例
2014/03/29 Python
Django原生sql也能使用Paginator分页的示例代码
2017/11/15 Python
pandas.DataFrame选取/排除特定行的方法
2018/07/03 Python
python批量处理文件或文件夹
2020/07/28 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
竞聘演讲稿范文
2014/01/12 职场文书
财务主管岗位职责
2014/02/28 职场文书
教师节学生演讲稿
2014/09/03 职场文书
副总经理岗位职责
2015/02/02 职场文书
科技馆观后感
2015/06/08 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python