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实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
tensorflow 1.0用CNN进行图像分类
Apr 15 Python
Python之批量创建文件的实例讲解
May 10 Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 Python
python3.7 的新特性详解
Jul 25 Python
详解python中的模块及包导入
Aug 30 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
python 插入日期数据到Oracle实例
Mar 02 Python
python中os包的用法
Jun 01 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 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 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
php制作动态随机验证码
2015/02/12 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
Js切换功能的简单方法
2010/11/23 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
AngularJS基础知识
2014/12/21 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
详细探究Python中的字典容器
2015/04/14 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
意大利网上药房:Farmacia 33
2020/01/27 全球购物
任课老师推荐信范文
2013/11/24 职场文书
实习协议书范本
2014/04/22 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电