【问题标题】:ValueError: '10.0.0.0/24' does not appear to be an IPv4 or IPv6 networkValueError:“10.0.0.0/24”似乎不是 IPv4 或 IPv6 网络
【发布时间】:2015-08-04 00:33:25
【问题描述】:

我想在 Python 中使用 IP 子网/IP 地址。我使用 ipaddress 模块创建了 Python 代码。当我在 pycharm IDE 中运行代码时,它运行良好。但是当我在命令提示符下输入python test.py 运行时,它会显示以下错误。

ValueError: '10.0.0.0/24' does not appear to be an IPv4 or IPv6 network

test.py

import ipaddress
srcIp = ipaddress.ip_network("10.0.0.0/24")
print(srcIp)

【问题讨论】:

    标签: python ip-address


    【解决方案1】:

    如果您使用 Unicode 字符串,它似乎可以在 Python 2.7 中使用。

    import ipaddress
    srcIp = ipaddress.ip_network(u'10.0.0.0/24')
    print srcIp
    

    【讨论】:

    • ipaddress 在 Python 2.7 中不存在
    • 如果您看到 ipaddress documentation,它显示“3.3 版中的新功能”。这也记录在"What's New In Python 3.3" page
    • srcIp = ipaddress.ip_network(u'10.0.0.0/24') 谢谢它的工作
    • 对于 Python 2,如果您在 ip_addr_str 中有 IP 地址,则可以通过 unicode(ip_addr_str) 使其成为 unicode。
    【解决方案2】:

    根本问题是ip_network() 实例化了一个IPv4Network/IPv6Network 对象,它要求网络地址是一个unicode 字符串。在 Python 3 中这很好,但在 Python 2 中,字符串默认不是 unicode。在 Python 2 中:

    >>> import ipaddress
    >>> ipaddress.IPv4Network('10.0.0.0/24')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "ipaddress.py", line 1486, in __init__
        self.network_address = IPv4Address(address)
      File "ipaddress.py", line 1271, in __init__
        self._check_packed_address(address, 4)
      File "ipaddress.py", line 528, in _check_packed_address
        expected_len, self._version))
    ipaddress.AddressValueError: '10.0.0.0/24' (len 11 != 4) is not permitted as an IPv4 address (did you pass in a bytes instead of a unicode object?)
    >>> ipaddress.IPv4Network(u'10.0.0.0/24')
    IPv4Network(u'10.0.0.0/24')
    

    ipaddress.ip_network() 捕获此异常并引发 ValueError 并带有不太详细的消息:

    >>> ipaddress.ip_network('10.0.0.0/24')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "ipaddress.py", line 148, in ip_network
        address)
    ValueError: '10.0.0.0/24' does not appear to be an IPv4 or IPv6 network
    

    所以它看起来像一个 unicode 问题。一种可能的解释是,也许 PyCharm 正在使用 Python >= 3.3,它在标准库中提供模块 ipaddress,并且默认情况下字符串是 unicode。您的命令行 Python 可能是版本 2,其中字符串默认为字节字符串,ipaddress.ip_network() 将失败,如上所示。我不确定这一点,因为print srcIp 语句表明您在这两种情况下都使用 Python 2?

    另一种可能性是 PyCharm 在某种程度上影响了 Python 2 中字符串文字的编码。我对 PyCharm 几乎一无所知,但是可以设置编码选项。也许这些有效地做了类似于from __future__ import unicode_literals 的事情。

    【讨论】:

    • 谢谢,这对理解潜在问题非常有帮助。是的,实际上是 print(srcip)....你知道如何将我的命令行 python 版本升级到 3.3
    • 您使用的是什么操作系统?如果在 Linux 上,apt-get 用于基于 Debian 的系统,yum 用于基于 redhat 的系统。如果是 Windows,请通过安装程序下载并安装。
    • 对于 Python 2,如果您在 ip_addr_str 中有 IP 地址,则可以通过unicode(ip_addr_str) 使其成为 unicode。
    【解决方案3】:

    请注意 10.0.0.0/24 是无效的子网。 10.0.0.0/8(A 类)网络中的第一个有效子网,现在用/24 子网掩码分割为...10.0.1.0/24。您必须丢弃网络端的顶部/底部,就像您为该位掩码的主机端的顶部/底部所做的那样。同理,10.255.255.0/24也是无效的。

    对于任何给定的子网掩码,有 2x - 2 个子网和 2x - 2 个主机

    ...其中 x 是掩码那一侧的位数。因此,对于/24,网络端有 24 个,主机端有 8 个,构成 16777214 个子网和 254 个主机。请注意位掩码的网络端计算的“- 2”部分。这意味着您必须丢弃(您不能发布)那些,因为在这种情况下,它们对 tcp/ip 的传输层有意义。

    这对于已经知道您同样不能绑定任何10.x.y.0/2410.x.y.255/24 地址的人来说应该是有意义的,因为它们已经有意义。

    【讨论】:

      【解决方案4】:

      回滚笔记本版本对我有用。

      pip uninstall notebook
      pip install notebook==5.6.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多