检查IP地址

Ror*_*ory 8 python ip ipv6

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

Igo*_*bin 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]
Run Code Online (Sandbox Code Playgroud)

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

import socket

try:
    socket.inet_aton(addr)
    print "ipv4 address"
except socket.error:
    print "not ipv4 address"
Run Code Online (Sandbox Code Playgroud)

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

我还想注意,那inet_aton将尝试转换(并真正转换它)地址,如10,127等等,看起来不像IP地址.

  • 请注意,由于这是发布的,ipaddr现在是ipaddress和Python 3库标准的一部分以及Python 2 backport:https://docs.python.org/3/library/ipaddress.html (2认同)

Joh*_*ooy 9

对于IPv4,您可以使用

socket.inet_aton(some_string)
Run Code Online (Sandbox Code Playgroud)

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

对于IPv6,您可以使用:

socket.inet_pton(socket.AF_INET6, some_string)
Run Code Online (Sandbox Code Playgroud)

同样,如果some_string不是有效地址,它会抛出异常.


Ole*_*pin 5

IPv4 + IPv6 解决方案仅依赖于标准库。返回4or6或 raise 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)
Run Code Online (Sandbox Code Playgroud)