检查IP地址

时间:2012-08-06 12:07:06

标签: python ip ipv6

是否有任何现有的库将字符串解析为ipv4或ipv6地址,或至少确定字符串是否为IP地址(任何一种)?

8 个答案:

答案 0 :(得分:15)

是的,有ipaddr模块,您可以帮助检查字符串是否是IPv4 / IPv6地址,并检测其版本。

import ipaddr
import sys

try:
   ip = ipaddr.IPAddress(sys.argv[1])
   print '%s is a correct IP%s address.' % (ip, ip.version)
except ValueError:
   print 'address/netmask is invalid: %s' % sys.argv[1]
except:
   print 'Usage : %s  ip' % sys.argv[0]

但这不是标准模块,因此并不总是可以使用它。 您还尝试使用标准socket模块:

import socket

try:
    socket.inet_aton(addr)
    print "ipv4 address"
except socket.error:
    print "not ipv4 address"

对于IPv6地址,您必须使用socket.inet_pton(socket.AF_INET6, address)

我还想注意,inet_aton会尝试转换(并真正转换)地址,例如10127等等,这些地址看起来不像IP地址。

答案 1 :(得分:8)

对于IPv4,您可以使用

socket.inet_aton(some_string)

如果它抛出异常,some_string不是有效的IP地址

对于IPv6,您可以使用:

socket.inet_pton(socket.AF_INET6, some_string)

如果some_string不是有效地址,它会再次抛出异常。

答案 2 :(得分:4)

IPv4 + IPv6解决方案仅依赖于标准库。返回46或引发ValueError

try:
    # Python 3.3+
    import ipaddress

    def ip_kind(addr):
        return ipaddress.ip_address(addr).version

except ImportError:
    # Fallback
    import socket

    def ip_kind(addr):
        try:
            socket.inet_aton(addr)
            return 4
        except socket.error: pass
        try:
            socket.inet_pton(socket.AF_INET6, addr)
            return 6
        except socket.error: pass
        raise ValueError(addr)

答案 3 :(得分:2)

您可以使用import netaddr if netaddr.valid_ipv4(str_ip) is True: print("IP is IPv4") else: if netaddr.valid_ipv6(str_ip) is True: print("IP is IPv6") 库。它有valid_ipv4 / valid_ipv6方法:

    $time = time();
    //Check the date of monday and sunday from this week.
    //Strtotime() bug on PHP version 5.5.31. Bug report: https://bugs.php.net/bug.php?id=63740
    if(date("l") == "Sunday"){
        $monday = date( 'd-m-Y', strtotime( 'monday last week' ) );
        $sunday = date( 'd-m-Y', strtotime( 'sunday last week' ) );
        //Check the weeknumber of this week.
        $weeknumber = date("W", strtotime('+0 day', $time));
    } else {
        $monday = date( 'd-m-Y', strtotime( 'monday this week' ) );
        $sunday = date( 'd-m-Y', strtotime( 'sunday this week' ) );
        //Check the weeknumber of this week.
        $weeknumber = date("W", strtotime('+1 day', $time));
    }

答案 4 :(得分:1)

ipaddr - Google的IP地址操作包。

请注意,最近接受了在Python标准库中包含修订版本的包的提议(请参阅PEP 3144)。

答案 5 :(得分:1)

尝试

apt-get install python-ipaddr

或从here

获取源代码

答案 6 :(得分:1)

如果您确定该地址有效并且只是想确定它是ipv4还是ipv6,那么仅仅这样做是不够的:

if ":" in address:
    print("Ipv6")
else:
    print("Ipv4")

答案 7 :(得分:0)

我更喜欢ip_interface,因为它处理带有和不带前缀掩码的情况,例如,“10.1.1.1/24”以及简单地“10.1.1.1”。不用说,适用于v4和v6

..