python利用标准库如何获取本地IP示例详解


Posted in Python onNovember 01, 2017

标准库

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。

Python标准库的主要功能有:

      1.文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能

      2.文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能

      3.操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、日志(logging)等功能

      4.网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能

      5.网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架

      6.W3C格式支持,包含HTML,SGML,XML的处理。

      7.其它功能,包括国际化支持、数学运算、HASH、Tkinter等

python利用标准库获取本地IP

这个最简单,但是也最不靠谱,依赖hosts文件,如果hosts文件没配置,一般容易获取到127.0.0.1

import socket
socket.gethostbyname(socket.gethostname())
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])
s.close()
import socket
alias myip="python -c 'import socket; print([l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith(\"127.\")][:1], [[(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]]) if l][0][0])'"
 
 
print([l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1], [[(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]]) if l][0][0])
 
 
print((([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")] or [[(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]]) + ["no IP found"])[0])
 
 
 
print([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
 
 
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])
import os
import socket
 
if os.name != "nt":
 import fcntl
 import struct
 
 def get_interface_ip(ifname):
 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s',
  ifname[:15]))[20:24])
 
def get_lan_ip():
 ip = socket.gethostbyname(socket.gethostname())
 if ip.startswith("127.") and os.name != "nt":
 interfaces = [
 "eth0",
 "eth1",
 "eth2",
 "wlan0",
 "wlan1",
 "wifi0",
 "ath0",
 "ath1",
 "ppp0",
 ]
 for ifname in interfaces:
 try:
 ip = get_interface_ip(ifname)
 break
 except IOError:
 pass
 return ip

linux上根据网卡名获取ip

>>> import socket, struct, fcntl
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sockfd = sock.fileno()
>>> SIOCGIFADDR = 0x8915
>>>
>>> def get_ip(iface = 'eth0'):
... ifreq = struct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
... try:
... res = fcntl.ioctl(sockfd, SIOCGIFADDR, ifreq)
... except:
... return None
... ip = struct.unpack('16sH2x4s8x', res)[2]
... return socket.inet_ntoa(ip)
...
>>> get_ip('eth0')
'10.80.40.234'
>>>

仅限windows

def getIPAddresses():
 from ctypes import Structure, windll, sizeof
 from ctypes import POINTER, byref
 from ctypes import c_ulong, c_uint, c_ubyte, c_char
 MAX_ADAPTER_DESCRIPTION_LENGTH = 128
 MAX_ADAPTER_NAME_LENGTH = 256
 MAX_ADAPTER_ADDRESS_LENGTH = 8
 class IP_ADDR_STRING(Structure):
 pass
 LP_IP_ADDR_STRING = POINTER(IP_ADDR_STRING)
 IP_ADDR_STRING._fields_ = [
 ("next", LP_IP_ADDR_STRING),
 ("ipAddress", c_char * 16),
 ("ipMask", c_char * 16),
 ("context", c_ulong)]
 class IP_ADAPTER_INFO (Structure):
 pass
 LP_IP_ADAPTER_INFO = POINTER(IP_ADAPTER_INFO)
 IP_ADAPTER_INFO._fields_ = [
 ("next", LP_IP_ADAPTER_INFO),
 ("comboIndex", c_ulong),
 ("adapterName", c_char * (MAX_ADAPTER_NAME_LENGTH + 4)),
 ("description", c_char * (MAX_ADAPTER_DESCRIPTION_LENGTH + 4)),
 ("addressLength", c_uint),
 ("address", c_ubyte * MAX_ADAPTER_ADDRESS_LENGTH),
 ("index", c_ulong),
 ("type", c_uint),
 ("dhcpEnabled", c_uint),
 ("currentIpAddress", LP_IP_ADDR_STRING),
 ("ipAddressList", IP_ADDR_STRING),
 ("gatewayList", IP_ADDR_STRING),
 ("dhcpServer", IP_ADDR_STRING),
 ("haveWins", c_uint),
 ("primaryWinsServer", IP_ADDR_STRING),
 ("secondaryWinsServer", IP_ADDR_STRING),
 ("leaseObtained", c_ulong),
 ("leaseExpires", c_ulong)]
 GetAdaptersInfo = windll.iphlpapi.GetAdaptersInfo
 GetAdaptersInfo.restype = c_ulong
 GetAdaptersInfo.argtypes = [LP_IP_ADAPTER_INFO, POINTER(c_ulong)]
 adapterList = (IP_ADAPTER_INFO * 10)()
 buflen = c_ulong(sizeof(adapterList))
 rc = GetAdaptersInfo(byref(adapterList[0]), byref(buflen))
 if rc == 0:
 for a in adapterList:
 adNode = a.ipAddressList
 while True:
 ipAddr = adNode.ipAddress
 if ipAddr:
  yield ipAddr
 adNode = adNode.next
 if not adNode:
  break

第三方库

https://github.com/ftao/python-ifcfg (本地下载)

import ifcfg
import json
 
for name, interface in ifcfg.interfaces().items():
 # do something with interface
 print interface['device']
 print interface['inet']
 print interface['inet6']
 print interface['netmask']
 print interface['broadcast']
 
default = ifcfg.default_interface()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
django使用html模板减少代码代码解析
Dec 12 Python
python中的变量如何开辟内存
Jun 26 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
python画双y轴图像的示例代码
Jul 07 Python
Python中包的用法及安装
Feb 11 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
Python collections.deque双边队列原理详解
Oct 05 Python
Python如何批量生成和调用变量
Nov 21 Python
Python排序函数的使用方法详解
Dec 11 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
python 算法题——快乐数的多种解法
May 27 Python
你眼中的Python大牛 应该都有这份书单
Oct 31 #Python
Python生成数字图片代码分享
Oct 31 #Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 #Python
Python列表删除的三种方法代码分享
Oct 31 #Python
Python文件的读写和异常代码示例
Oct 31 #Python
Python网络编程详解
Oct 31 #Python
Python中enumerate函数代码解析
Oct 31 #Python
You might like
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
vue 需求 data中的数据之间的调用操作
2020/08/05 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
Python 网络编程起步(Socket发送消息)
2008/09/06 Python
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
浅谈Python中的bs4基础
2018/10/21 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python实现简单俄罗斯方块
2020/03/13 Python
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
个性大学生自我评价
2013/12/04 职场文书
给实习单位的感谢信
2014/02/01 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
会计学习心得体会
2014/09/09 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python
总结Python使用过程中的bug
2021/06/18 Python