我想在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)
答案 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/24
和10.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;
}