2010-11-14 5 views
27

में सापेक्ष आयात - हे सब - मैं पाइथन में सापेक्ष आयात के साथ अपने बालों को खींच रहा हूं। मैंने एसओ और अन्य मंचों पर दस्तावेज 30 बार और कई पोस्ट पढ़ी हैं - अभी भी काम नहीं लग रहा है।पायथन

मेरे निर्देशिका संरचना वर्तमान में इस

src/ 
    __init__.py 
    main.py 
    components/ 
     __init__.py 
     expander.py 
     language_id.py 
    utilities/ 
     __init__.py 
     functions.py 

मैं expander.py और language_id.py कार्यों मॉड्यूल के लिए उपयोग करना चाहते हैं की तरह लग रहा है। मैं python main.py चलाता हूं जो मॉड्यूल को घटक से निष्पादित करता है। एक्सपेन्डर आयात * और घटक। Language_id आयात *।

हालांकि, विस्तारक और language_id अंदर कोड कार्यों मॉड्यूल का उपयोग करने की:

ValueError: Attempted relative import beyond toplevel package 

मैं समय की एक गुच्छा इस पर चले गए हैं और यह लगता है:

from ..utilities.functions import * 

मैं यह त्रुटि प्राप्त दस्तावेज़ीकरण का पालन करें। किसी के पास कोई गलत विचार है कि यहां क्या गलत हो रहा है?

+8

आपको पहले से ही समाधान मिल गया है, लेकिन यह समझाने के लिए कि इसकी आवश्यकता क्यों है: पैकेज पूरी तरह से निहित होना चाहिए। जब आप इसके अंदर main.py चला रहे हों तो यह src/पैकेज के रूप में व्यवहार नहीं करेगा। –

उत्तर

21

कोई बात नहीं, मैं इसे हल:

src/ 
    main.py 
    mod/ 
     __init__.py 
     components/ 
      __init__.py 
      expander.py 
      language_id.py 
     utilities/ 
      __init__.py 
      functions.py 

main.py तो के रूप में सबपैकेज को दर्शाता है:

from mod.components.expander import * 
from mod.utilities.functions import * 

expander.py और language_id.py साथ functions.py की पहुंच है:

from ..utilities.functions import * 

लेकिन दिलचस्प बात यह है कि मेरे पास घटक निर्देशिका के अंदर एक टेक्स्ट फ़ाइल थी जो expander.py हमें तों। हालांकि, रनटाइम पर यह फ़ाइल का पता नहीं लगा सका, भले ही यह एक ही निर्देशिका में था। मैंने टेक्स्ट फ़ाइल को एक ही निर्देशिका में main.py के रूप में स्थानांतरित कर दिया और यह काम किया। काउंटर-अंतर्ज्ञानी लगता है।

+13

सभी नए मॉड्यूल आयात करने वाली सामग्री टूट गई है और अनजान है। –

+3

पाठ फ़ाइलों को खोलना कार्यशील निर्देशिका से काम करता है जहां आपने प्रोग्राम शुरू किया था, जबकि आयात स्क्रिप्ट के स्थान से संबंधित है। आप अपने पथ को खोजने के लिए मॉड्यूल में \ _ \ _ फ़ाइल \ _ \ _ का उपयोग कर सकते हैं, और इसलिए एक ही निर्देशिका में चीजों का संदर्भ लें, हालांकि यह बहुत ही सुरुचिपूर्ण नहीं है। यदि पाठ फ़ाइल प्रोग्राम के लिए स्थिर डेटा है, तो इसे पाइथन मॉड्यूल में बनाना और इसे आयात करना आसान हो सकता है। –

+1

आप उन्हें ढूंढने के लिए मॉड्यूल नेमस्पेस का उपयोग कर फ़ाइलों को पुनर्प्राप्त करने के लिए 'pkgutil.get_data() '(http://docs.python.org/library/pkgutil#pkgutil.get_data) का उपयोग कर सकते हैं। उदाहरण के लिए, 'raw_data = pkgutil.get_data (' mod.components ',' data.txt ')' फ़ाइल से कच्चे बाइनरी डेटा को पुनर्प्राप्त करेगा। – ncoghlan