ValueError:' 10.0.0.0/24'似乎不是IPv4或IPv6网络

时间:2015-05-22 05:32:44

标签: python ip-address

我想在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)

5 个答案:

答案 0 :(得分:13)

如果您使用Unicode字符串,它似乎适用于Python 2.7。

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

答案 1 :(得分:7)

根本问题是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&gt; = 3.3,它在标准库中提供模块ipaddress,默认情况下字符串是unicode。您的命令行Python可能是版本2,其中字符串默认为字节字符串,ipaddress.ip_network()将失败,如上所示。我对此不确定,因为print srcIp语句表明您在两种情况下都使用Python 2?

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

答案 2 :(得分:0)

仅注意到10.0.0.0/24是无效的子网。 10.0.0.0/8(A类)网络中的第一个有效子网(现在用/24子网掩码进行了切片)是10.0.1.0/24。您必须扔掉网络端的顶部/底部,就像处理该位掩码的主机端的顶部/底部一样。出于相同的原因,10.255.255.0/24也无效。

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

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

对于已经知道您同样无法绑定任何10.x.y.0/2410.x.y.255/24地址的任何人,这应该有意义,因为它们已经意味着某些东西了。

答案 3 :(得分:0)

回滚笔记本电脑的版本对我有用。

pip uninstall notebook
pip install notebook==5.6.0

答案 4 :(得分:-1)

Python 3:

@Override
public Executor getAsyncExecutor() {
    return MY_EXECUTOR;
}

@Override
public  AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return MY_EXCEPTION_HANDLER;
}