如何导入python标准库并使用其功能_python利用标准库如何获取本地IP示例详解

标准库

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

第三方库

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()

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值