2015-05-22 6 views
5

Ich möchte mit IP-Subnetzen/IP-Adressen in Python arbeiten. Ich habe den Python-Code mit dem Modul ipaddress erstellt. Wenn ich den Code in der pycharm IDE ausführe, funktioniert es gut. Aber wenn ich die Eingabeaufforderung durch Eingabe von python test.py ausführen, wird der folgende Fehler angezeigt.ValueError: '10.0.0.0/24 'scheint kein IPv4- oder IPv6-Netzwerk zu sein

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) 

Antwort

9

Es scheint in Python 2.7, zu arbeiten, wenn Sie einen Unicode-String verwenden.

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

'ipaddress' existiert nicht in Python 2.7 –

+0

Wenn Sie die [' ipaddress' Dokumentation] (https://docs.python.org/3/library/ipaddress.html) sehen, wird "Neu in Version 3.3" angezeigt . " Dies ist auch auf der Seite "Was ist neu in Python 3.3?" (Https://docs.python.org/3/whatsnew/3.3.html) dokumentiert. –

+4

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

7

Das zugrunde liegende Problem ist, dass ip_network() instanziiert ein IPv4Network/IPv6Network Objekt, das die Netzwerkadresse erfordert eine Unicode-Zeichenfolge zu sein. In Python 3 ist das in Ordnung, aber in Python 2 sind Strings standardmäßig nicht Unicode. 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() Fänge diese Ausnahme und wirft eine ValueError mit einer weniger detaillierten Nachricht:

>>> 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 

So sieht es aus wie eine Unicode-Ausgabe. Eine mögliche Erklärung ist, dass PyCharm Python> = 3.3 verwendet, das das Modul in der Standardbibliothek bereitstellt und in dem Strings standardmäßig Unicode sind. Ihre Befehlszeile Python könnte Version 2 sein, in der Zeichenfolgen standardmäßig Bytezeichenfolgen entsprechen, und ipaddress.ip_network() schlägt fehl, wie oben gezeigt. Ich bin mir nicht sicher, weil die print srcIp-Anweisung anzeigt, dass Sie in beiden Fällen Python 2 verwenden? Eine andere Möglichkeit ist, dass PyCharm irgendwie die Kodierung von String-Literalen in Python 2 beeinflusst. Ich weiß fast nichts über PyCharm, aber es gibt Kodierungsoptionen, die gesetzt werden können. Vielleicht machen diese etwas ähnlich wie from __future__ import unicode_literals.

+0

Danke, das ist sehr hilfreich, um das zugrunde liegende Problem zu verstehen. und ja, eigentlich ist es print (srcip) .... weißt du, wie ich meine Kommandozeilen-Python-Version auf 3.3 aktualisieren kann –

+0

Welches Betriebssystem benutzt du? Wenn unter Linux apt-get für Debian-basierte Systeme, 'yum' für redhat-basierte Systeme. Wenn Windows heruntergeladen und über das Installationsprogramm installiert wird. – mhawke

+0

Für Python 2, wenn Sie die IP-Adresse in ip_addr_str hatten, können Sie make Unicode durch 'unicode (ip_addr_str)' machen. –