ValueError:'10 .0.0.0/24'似乎不是IPv4或IPv6网络

Vis*_*tel 7 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
Run Code Online (Sandbox Code Playgroud)

test.py:

import ipaddress
srcIp = ipaddress.ip_network("10.0.0.0/24")
print(srcIp)
Run Code Online (Sandbox Code Playgroud)

小智 14

如果你使用Unicode字符串,它似乎在Python 2.7中工作.

import ipaddress
srcIp = ipaddress.ip_network(u'10.0.0.0/24')
print srcIp
Run Code Online (Sandbox Code Playgroud)


mha*_*wke 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')
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

所以它看起来像一个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.