簡體   English   中英

ValueError:'10 .0.0.0 / 24'似乎不是IPv4或IPv6網絡

[英]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/2410.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM