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 相关文章推荐
Python读写Redis数据库操作示例
Mar 18 Python
Python实现Tab自动补全和历史命令管理的方法
Mar 12 Python
详解Python中的strftime()方法的使用
May 22 Python
Python实现将xml导入至excel
Nov 20 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
python版简单工厂模式
Oct 16 Python
简单实现python收发邮件功能
Jan 05 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
python实现俄罗斯方块小游戏
Apr 24 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 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
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
python实现备份目录的方法
2015/08/03 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
python调用webservice接口的实现
2019/07/12 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
python实现126邮箱发送邮件
2020/05/20 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
哈萨克斯坦移动和数字技术在线商店:SatelOnline.kz
2020/09/04 全球购物
国贸专业个人求职信范文
2014/01/08 职场文书
销售会计岗位职责
2014/03/15 职场文书
减负增效提质方案
2014/05/23 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
Golang入门之计时器
2022/05/04 Golang