2015-05-22 11 views
5

Desidero lavorare con subnet IP/indirizzi IP in Python. Ho creato il codice Python usando il modulo ipaddress. Quando eseguo il codice nell'IDE di pycharm, funziona correttamente. Ma quando corro al prompt dei comandi digitando python test.py, mostra il seguente errore.ValueError: '10 .0.0.0/24 'non sembra essere una rete IPv4 o IPv6

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) 

risposta

9

Sembra funzionare in Python 2.7, se si utilizza una stringa Unicode.

import ipaddress 
srcIp = ipaddress.ip_network(u'10.0.0.0/24') 
print srcIp 
+0

'ipaddress' non esisteva in Python 2.7 –

+0

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). –

+4

@ZachGates https://pypi.python.org/pypi/ipaddress – poke

7

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.

+0

Grazie, è molto utile capire il problema sottostante. e sì, in realtà è print (srcip) .... sai come aggiornare la mia versione python da riga di comando a 3.3 –

+0

Quale sistema operativo stai usando? Se su Linux, apt-get per sistemi basati su Debian, 'yum' per sistemi basati su RedHat. Se Windows, scarica e installa tramite il programma di installazione. – mhawke

+0

Per Python 2 se si ha l'indirizzo IP in ip_addr_str, è possibile renderlo reso unicode da 'unicode (ip_addr_str)'. –

Problemi correlati