Il problema fondamentale è che ip_network()
un'istanza di un oggetto IPv4Network/IPv6Network
che richiede l'indirizzo di rete per essere una stringa unicode. In Python 3 questo va bene, ma in Python 2 le stringhe non sono unicode di default. In 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()
catture questa eccezione e solleva una ValueError
con un messaggio meno dettagliata:
>>> 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
in modo che appaia come un problema di unicode. Una possibile spiegazione è che forse PyCharm sta usando Python> = 3.3 che fornisce il modulo ipaddress
nella libreria standard e in cui le stringhe sono unicode per impostazione predefinita. La tua riga di comando Python potrebbe essere la versione 2, in cui le stringhe sono predefinite come stringhe di byte e ipaddress.ip_network()
non riuscirà come mostrato sopra. Non sono sicuro di questo perché la dichiarazione print srcIp
indica che stai usando Python 2 in entrambi i casi?
Un'altra possibilità è che PyCharm influenzi in qualche modo la codifica di stringhe letterali in Python 2. Non conosco quasi nulla di PyCharm, ma ci sono opzioni di codifica che possono essere impostate. Forse questi fanno effettivamente qualcosa di simile a from __future__ import unicode_literals
.
'ipaddress' non esisteva in Python 2.7 –
Se viene visualizzata la [' ipaddress' documentation] (https://docs.python.org/3/library/ipaddress.html), si legge "Nuovo nella versione 3.3 ". Questo è anche documentato nella pagina ["Novità di Python 3.3"] (https://docs.python.org/3/whatsnew/3.3.html). –
@ZachGates https://pypi.python.org/pypi/ipaddress – poke