2015-05-22 5 views
5

मैं पाइथन में आईपी सबनेट/आईपी पते के साथ काम करना चाहता हूं। मैंने ipaddress मॉड्यूल का उपयोग कर पायथन कोड बनाया है। जब मैं पिचर्म आईडीई में कोड चलाता हूं, तो यह ठीक काम करता है। लेकिन जब मैं python test.py टाइप करके कमांड प्रॉम्प्ट पर चलता हूं, तो यह निम्न त्रुटि दिखाता है।ValueError: '10 .0.0.0/24 'एक आईपीवी 4 या आईपीवी 6 नेटवर्क प्रतीत नहीं होता है

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) 

उत्तर

9

यह अजगर 2.7 में काम करने के लिए, यदि आप एक यूनिकोड स्ट्रिंग का उपयोग लगता है।

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

'ipaddress' पायथन में मौजूद नहीं था 2.7 –

+0

यदि आप [' ipaddress' दस्तावेज़] (https://docs.python.org/3/library/ipaddress.html) देखते हैं, तो यह "संस्करण 3.3 में नया" पढ़ता है । " यह ["व्हाट्स न्यू इन पायथन 3.3" पृष्ठ पर भी दस्तावेज किया गया है (https://docs.python.org/3/whatsnew/3.3.html)। –

+4

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

7

मूल समस्या है कि ip_network() को दर्शाता है एक IPv4Network/IPv6Network वस्तु जो नेटवर्क पता होना आवश्यक है एक यूनिकोड स्ट्रिंग हो रहा है। पायथन 3 में यह ठीक है, लेकिन पायथन 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: अजगर 2 में

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

तो यह एक यूनिकोड मुद्दे की तरह दिखता है। एक संभावित स्पष्टीकरण यह है कि शायद PyCharm पायथन> = 3.3 का उपयोग कर रहा है जो मानक लाइब्रेरी में मॉड्यूल ipaddress प्रदान करता है और जिसमें स्ट्रिंग डिफ़ॉल्ट रूप से यूनिकोड होते हैं। आपकी कमांड लाइन पायथन संस्करण 2 हो सकती है, जिसमें स्ट्रिंग्स बाइट स्ट्रिंग्स के लिए डिफ़ॉल्ट हैं, और ipaddress.ip_network() ऊपर दिखाए गए अनुसार विफल हो जाएंगे। मुझे इस बारे में निश्चित नहीं है क्योंकि print srcIp कथन इंगित करता है कि आप दोनों मामलों में पायथन 2 का उपयोग कर रहे हैं?

एक और संभावना यह है कि PyCharm किसी भी तरह से पायथन 2 के भीतर स्ट्रिंग अक्षर के एन्कोडिंग को प्रभावित कर रहा है। मुझे PyCharm के बारे में लगभग कुछ नहीं पता है, लेकिन एन्कोडिंग विकल्प सेट किए जा सकते हैं। शायद ये प्रभावी रूप से from __future__ import unicode_literals के समान कुछ करते हैं।

+0

धन्यवाद, अंतर्निहित समस्या को समझना बहुत उपयोगी है। और हाँ, असल में यह प्रिंट है (srcip) .... क्या आप जानते हैं कि मेरे कमांड लाइन पायथन संस्करण को 3.3 –

+0

पर अपग्रेड कैसे करें आप किस ओएस का उपयोग कर रहे हैं? यदि लिनक्स पर, डेबियन आधारित सिस्टम के लिए उपयुक्त है, तो redhat आधारित सिस्टम के लिए 'yum'। यदि विंडोज़, इंस्टॉलर के माध्यम से डाउनलोड और इंस्टॉल करें। – mhawke

+0

पाइथन 2 के लिए यदि आपके पास ip_addr_str में आईपी पता था तो आप इसे यूनिकोड (ip_addr_str) 'द्वारा यूनिकोड बना सकते हैं। –

संबंधित मुद्दे