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之字典,你还记得吗?
Sep 20 Python
Python进行数据科学工作的简单入门教程
Apr 01 Python
pytorch构建网络模型的4种方法
Apr 13 Python
Python实现定时精度可调节的定时器
Apr 15 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 Python
Python连接字符串过程详解
Jan 06 Python
python爬虫开发之urllib模块详细使用方法与实例全解
Mar 09 Python
Django之腾讯云短信的实现
Jun 12 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
Aug 05 Python
Python 2.6.6升级到Python2.7.15的详细步骤
Dec 14 Python
Python 数据科学 Matplotlib图库详解
Jul 07 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
微信支付开发发货通知实例
2016/07/12 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
js实现双色球效果
2020/08/02 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python中的ctime()方法使用教程
2015/05/22 Python
Python用模块pytz来转换时区
2016/08/19 Python
python+django加载静态网页模板解析
2017/12/12 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
什么是TCP/IP
2014/07/27 面试题
党支部特色活动方案
2014/08/20 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
中层干部考核评语
2015/01/04 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
python字典进行运算原理及实例分享
2021/08/02 Python