微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在脚本中包装 linux 和 windows 的 python 代码 - 最好的方法?

如何解决在脚本中包装 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 举报,一经查实,本站将立刻删除。