如何解决在脚本中包装 linux 和 windows 的 python 代码 - 最好的方法?
我喜欢为工作中的同事编写有用的 cli 脚本,我们在不同的操作系统上总是遇到相同的问题。我发现遵循 question 但与那些具有更高框架(如 BeeWare)的解决方案相比,我正在寻找在 cli 上运行并且对所有类型的 Python 程序员都非常可读的非常低级的脚本。所以我决定创建一个用例和一个示例 ipchecker.py 脚本,它说明了我与朋友分享我的食谱的首选概念。每个人都可以从中受益的最有用的情况是查看自己的 IP 地址。结帐MORE ON IPS PYTHON
我知道有很多方法可以检查 IPS,但我想以一种可以看作是将来添加更多复杂内容的通用结构的方式来进行。所以让我们从这个脚本开始:
user@pc : pyton ipchecker.py # 打印我的地址列表
user@pc : ['192.168.178.11','172.18.1.9','172.00.0.1','2ak1:c22:c898:2d00:9788:6b0c:9ws2:4ss4:03c','13222.00.0.1' :23d0:1a2c:23f5:4rs0:88r1']
ipchecker.py
import subprocess
class LinuxIpChecker:
"""
Only for linux
"""
def __init__(self) -> None:
self.runOnLinux()
def runOnLinux(self):
output = subprocess.check_output(['hostname','-I'])
addresses = [
i for i in str(
output.decode(
'utf-8'
).replace('\n','')
).split(' ') if len(i) > 0
]
print(addresses)
return addresses
class IpChecker(object):
"""
Just run and do not bother if windows or linux
"""
def __init__(self) -> None:
self.run()
def run(self):
try:
self.runOnLinux()
return
except Exception as e:
print(e)
try:
self.runOnWindows()
except Exception as e:
print('runOnWindows ::: \n',e)
def runOnLinux(self):
output = subprocess.check_output(['hostname','-I'])
addresses = [i for i in str(output.decode(
'utf-8'
).replace('\n','')).split(' ') if len(i) > 0
]
print(addresses)
return addresses
def runOnWindows(self):
addresses = []
for i in self.getIPAddresses():
print(i)
addresses.append(i)
return addresses
def getIPAddresses():
"""
credits to https://stackoverflow.com/users/18745/dzinx
"""
from ctypes import Structure,windll,sizeof
from ctypes import c_ulong,c_uint,c_ubyte,c_char
from ctypes import POINTER,byref
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",("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",("type",("dhcpEnabled",("currentIpAddress",("ipAddressList",IP_ADDR_STRING),("gatewayList",("dhcpserver",("haveWins",("primaryWinsServer",("secondaryWinsServer",("leaSEObtained",("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
if __name__ == '__main__':
result = LinuxIpChecker()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。