2014-04-08 15 views
5

फेंकता है तो मैं सह-कार्यकर्ता द्वारा टेम्पलेट सेट का उपयोग कर रहा हूं और पाइथन के लिए नौसिखिया के रूप में मुझे कुछ बहुत याद आ रहा है।__init__.py फ़ाइल से संबंधित आयात त्रुटि

मुख्य निर्देशिका में init फ़ाइल है जिसमें एक मॉड्यूल है जो मुझे मुख्य पायथन फ़ाइल के लिए आवश्यक है जो त्रुटि उत्पन्न करता है।

सह कार्यकर्ता प्रयोग किया है:

from . import X 

कहाँ एक्स मॉड्यूल था, लेकिन जब यह (और एक आबादी वाले init फाइल) अपने ही निर्देशिका पर कॉपी यह इस त्रुटि उत्पन्न करता है:

ValueError: Attempted relative import in non-package

से गूगल और एसओ मैं इकट्ठा करता हूं कि यह बिल्कुल ठीक और तार्किक है इसलिए मैं सोच रहा हूं, एक नौसिखिया के रूप में, जो मैंने याद किया है।

+0

संभावित डुप्लिकेट [\ _ \ _ init \ _ \ _। Py] के साथ गैर-पैकेज में सापेक्ष आयात का प्रयास किया गया है (http://stackoverflow.com/questions/11536764/attempted-relative-import-in-non- पैकेज-इन-इन-इन-पीआईटी) –

+0

उस सुझाव में वह मानक .py फ़ाइल से खींच रहा है। मेरी समस्या __init__.py फ़ाइल से खींचने के बारे में है। – thewellis

+0

लेकिन आपकी समस्या का एक ही कारण है। मुझे आशा है कि मेरा जवाब आपकी त्रुटि के कारण को स्पष्ट करता है। –

उत्तर

8

आपको समझना होगा कि पाइथन मॉड्यूल को कैसे प्रबंधित करता है।

जब आप एक स्क्रिप्ट के साथ दुभाषिया शुरू करते हैं, तो यह स्क्रिप्ट मेलिंग नाम __main__ के साथ मुख्य मॉड्यूल बन जाती है।

import का उपयोग करते समय, खोज पथ में अन्य मॉड्यूल खोजे जाते हैं, ताकि आप sys.path का उपयोग करके (और बदल सकते हैं) भी एक्सेस कर सकें। sys.path की पहली प्रविष्टि आमतौर पर खाली होती है और वर्तमान निर्देशिका के लिए खड़ी होती है।

खोज पथ के भीतर एक निर्देशिका एक पैकेज है यदि इसमें __init__.py फ़ाइल है।

अब, जब आप एक निर्देशिका है कि एक __init__.py फ़ाइल के भीतर एक स्क्रिप्ट को निष्पादित, यह स्क्रिप्ट __main__ हो जाएगा और के रूप में यह sys.path में नहीं है निर्देशिका, एक पैकेज के रूप में नहीं किया जाता है!

उदाहरण के लिए, निम्न निर्देशिका लेआउट पर विचार करें:

 
root/ 
    pkg/ 
     __init__.py 
     b.py 
     c.py 
    a.py 

जब आप root/ निर्देशिका से python a.py चलाने के लिए, आप pkg/ आयात और इस पैकेज के भीतर संबंधी आयात का उपयोग कर सकते हैं (जैसे, from . import cb.py या __init__.py में)।

जब आप pkg निर्देशिका से python b.py चलाने के लिए, आप के बाद से अजगर एक पैकेज के रूप में pkg को नहीं पहचानता है रिश्तेदार के आयात का उपयोग नहीं कर सकते हैं: यह sys.path में नहीं है। पायथन के लिए, pkg एक सामान्य निर्देशिका है, कोई फर्क नहीं पड़ता कि इसमें __init__.py है। c.py का पूर्णतः योग्य नाम केवल c है, pkg.c नहीं, इसलिए एक सापेक्ष from . import c काम नहीं करेगा।

+1

मुझे लगता है कि मैं समझता हूं। चूंकि सापेक्ष आयात का उपयोग किसी फ़ोल्डर के लिए स्थानीय होता है, इसलिए यह त्रुटि उत्पन्न करेगा क्योंकि संदर्भ संदर्भ परिपत्र है। जो अजीब बात है कि मेरा सहकर्मी अपनी स्क्रिप्ट में इस रणनीति का उपयोग करता है। वह जो कुछ भी कोड करता है वह काफी तार्किक और वाटरटाइट दिखता है, शायद उसके पास जेनकींस एक्सटेंशन या कुछ ऐसा है जो इसे पार करता है। – thewellis

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