2014-05-21 16 views
6

मेरा पायथन कोड बहुत आसान है, Arduino Yun पर बनाए गए वेबपृष्ठ पर एक GET अनुरोध करें।मुझे socket.gaierror क्यों मिल रहा है: [एरर्नो 2] पायथन HTTPLib

import httplib 
conn = httplib.HTTPConnection("yun.local") 
conn.request("GET", "/arduino/read/temp/0") 
r1 = conn.getresponse() 
print r1.status, r1.reason, r1.read() 

जब मैं Arduino यूं की लिनक्स तरफ इस चलाने के लिए, निम्न त्रुटि socket.gaierror दिखाता है: [errno -2] नाम या सेवा ज्ञात नहीं। हालांकि, जब मैं अपने मैक पर एक ही स्क्रिप्ट चलाता हूं, तो यह ठीक काम करता है।

मैं httplib.HTTPConnection ("192.168.240.1"), जो Arduino यूं से आईपी है HTTPConnection तर्क बदलकर इस समस्या को दूर।

तो, यह त्रुटि Arduino के लिनक्स पक्ष पर क्यों दिखाई दे रही है और मेरे मैक में नहीं?

धन्यवाद।

+0

क्या 'yun.local' को Arduino पर'/etc/hosts' में कॉन्फ़िगर किया गया है? ... –

+0

उस फ़ाइल के अंदर एकमात्र चीज "127.0.0.1 लोकलहोस्ट" –

+0

है तो 'yun.local' नहीं है आपके लिनक्स distrib पर मौजूद है। इसलिए त्रुटि। एसएसएच के माध्यम से 'पिंग yun.local'' करने का प्रयास करें, आपको एक ही समस्या दिखाई देगी। '192.168.240.1 yun.local 'जोड़ें और यह ठीक होना चाहिए। –

उत्तर

8

socket.gaierror पाइथन से आता है getaddrinfo() या getnameinfo() चलाने में सक्षम नहीं है। आपके मामले में यह पहली बार संभावना है। वह फ़ंक्शन होस्ट और पोर्ट लेता है और मेजबान से कनेक्ट करने के तरीके के बारे में जानकारी के साथ tuples की एक सूची देता है। यदि आप उस समारोह में होस्ट नाम देते हैं तो नीचे दिए गए आईपी पते को हल करने का प्रयास किया जाएगा।

तो, त्रुटि आपके द्वारा लिखे गए पते को हल करने में सक्षम नहीं है (yun.local) एक मान्य आईपी पते पर। मैं सुझाव दूंगा कि आप डिवाइस पर /etc/hosts देखें ताकि यह देखने के लिए कि क्या यह परिभाषित किया गया है या नहीं। आप भी इस तरह के host या telnet के रूप में कमांड लाइन उपकरण के साथ की कोशिश कर सकते हैं, बस के समाधान की जाँच करने के:

उदाहरण के लिए:

[[email protected] ~]$ telnet localhost 80 
Trying ::1... 
Trying 127.0.0.1... 
telnet: Unable to connect to remote host: Connection refused 

वहाँ इसे हल करने में कामयाब मेरी localhost::1 (IPv6) और 127.0.0.1 को (आईपीवी 4), क्योंकि यह /etc/resolv.conf में मौजूद है। यदि मैं इसके बजाय आपके होस्ट के साथ प्रयास करता हूं:

[[email protected] ~]$ telnet yun.local 80 
telnet: could not resolve yun.local/80: Name or service not known 
+1

मैं समझ सकता हूं कि त्रुटि कैसे होती है। मैंने अपने मैक और मेरे लिनक्स पर "/etc/resolv.conf" और "/ etc/hosts" दोनों की जांच की है और दोनों में सामग्री समान है। तो मुझे अभी भी नहीं पता कि लिनक्स पर त्रुटि क्यों दिखाई देगी, मैक में नहीं। –

+0

यह कहकर कि त्रुटि दिखाई नहीं दे रही है, क्या आपका मतलब है कि यदि आप इसे अपने मैक पर चलाते हैं तो पाइथन कोड काम करता है? मैं मछली पकड़ने के लिए क्या कर रहा हूं यह है कि क्या यह त्रुटि रिपोर्टिंग में केवल एक अंतर है या अगर यह वास्तव में कुछ जादू तरीके से 'yun.local' के लिए आईपी पता ढूंढने में सफल होता है। पाइथन में अधिकांश नेटवर्क कार्यक्षमता सिस्टम फ़ंक्शंस पर नीचे आती है। सिस्टम अंतर त्रुटियों की स्थिति पर अलग-अलग व्यवहार कर सकते हैं। –

+0

हां, मेरे मैक में पायथन दुभाषिया को 'yun.local' के लिए आईपी पता मिलता है लेकिन लिनक्स में पायथन दुभाषिया को' yun.local' के लिए आईपी पता नहीं मिला है।तो आप शायद सही हैं, कुछ सिस्टम मतभेद होना चाहिए जो विभिन्न व्यवहार का कारण बन सकता है। –

0

मेरे मामले में, मैंने होस्टनाम बदल दिया। इसलिए मुझे एहसास हुआ कि/etc/hosts पुराने होस्टनाम बने रहे हैं, मैंने अभी/etc/hosts फ़ाइल में नए होस्टनाम में अपडेट किया है और यह मेरे लिए काम करता है।

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