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

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

我想在 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 2.7 中工作,如果你使用 Unicode 字符串。

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

潜在的问题是 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.

的事情

请注意 10.0.0.0/24 是无效子网。 10.0.0.0/8 (Class A) 网络中的第一个有效子网,现在用 /24 子网掩码切片是... 10.0.1.0/24。您必须在网络端丢弃 top/bottom,就像您在该位掩码的主机端丢弃 top/bottom 一样。同样的道理,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 地址的人来说,这应该是有意义的,因为它们已经意味着什么。

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

pip uninstall notebook
pip install notebook==5.6.0