[英]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)
如果你使用Unicode字符串,它似乎在Python 2.7中工作。
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
做了類似的from __future__ import unicode_literals
。
注意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個主機
...其中x是掩碼那一側的位數。 因此對於/24
,網絡端為/24
,主機端為8,制作16777214個子網和254個主機。 注意位掩碼的網絡側的計算的“ - 2”部分。 這意味着你必須扔掉(你不能發出)那些因為它們對tcp / ip的傳輸層有意義,在這種情況下。
對於那些已經知道你同樣不能綁定任何10.xy0/24
和10.xy255/24
地址的人來說,這應該是有意義的,因為它們已經意味着什么。
回滾筆記本版本對我有用。
pip uninstall notebook
pip install notebook==5.6.0
Python 3:
import ipaddress
srcIp = ipaddress.ip_network(str('10.0.0.0/24'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.