ipaddress模块​​ValueError('%s已设置主机位'%self)

rɑː*_*dʒɑ 2 python ip-address python-3.x

我正在尝试通过Python3 ipaddress模块列出给定网络范围内的有效主机,但是ValueError('%s has host bits set' % self) 在尝试列出所有有效主机时却出现ValueError 。

>>> ip_range=input("Enter IP Range:")
Enter IP Range:192.168.56.101/16
>>> list(ipa.ip_network(ip_range).hosts())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/ipaddress.py", line 74, in ip_network
    return IPv4Network(address, strict)
  File "/usr/local/lib/python3.5/ipaddress.py", line 1536, in __init__
    raise ValueError('%s has host bits set' % self)
ValueError: 192.168.56.101/16 has host bits set
Run Code Online (Sandbox Code Playgroud)

小智 9

您还有另一个选择。从上面提到的文档中,我们可以看到:

如果strict为True,并且在提供的地址中设置了主机位,则将引发ValueError。否则,主机位将被屏蔽以确定适当的网络地址。

因此,请重试。

ip_range = '192.168.56.101/16'
list(ipaddress.ip_network(ip_range, False).hosts())
Run Code Online (Sandbox Code Playgroud)


fin*_*las 8

两种解决方案

您可以更改输入或代码。

1:改变输入

上面你提到你的输入是192.168.56.101/16. 在16该IP-范围定义了主机位。Python 希望您清除它们(将所有这些位设置为 0)。您将 ip 指定为192.168.56.101,同时告诉有16主机位。Python 预计最后一位160.

在二进制叶看起来像这样:11000000.10101000.00111000.01100101您需要清除最后 16 位。然后它看起来像这样:(11000000.10101000.0.0等于192.168.0.0十进制)。

结论:您需要更改输入以192.168.0.0/16使其正常工作。

2:更改代码

查看Python 文档

如果 strict 为 True 并且在提供的地址中设置了主机位,则引发 ValueError 。否则,主机位被屏蔽以确定适当的网络地址。

因此,通过更改代码来停用严格模式:

更改ip_network(target)ip_network(target, False)

在这里,您可以在技术上输入192.168.56.101/16.

参考


这个答案来晚了,但我相信它会有所帮助!


Laf*_*los 6

文档中所述

如果地址不代表有效的IPv4或IPv6地址,或者网络设置了主机位,则会引发ValueError

斜线后的数字(在您的情况下为16)表示为子网保留的位数,因此后16位是您的主机位。此方法要求这些位为0(未设置)。

  • `192.168.0.0/16` 是你最可能想要的。 (2认同)