2012-02-14 14 views
16

बहुस्तरीय रिश्तेदार आयातबहुस्तरीय रिश्तेदार आयात

मैं फ़ोल्डर संरचना

top\ 
    __init__.py 
    util\ 
     __init__.py 
     utiltest.py 
    foo\ 
     __init__.py 
     foo.py 
     bar\ 
     __init__.py 
     foobar.py 

मैं foobar.py मॉड्यूल utiltest.py से उपयोग करना चाहते निम्नलिखित है। मैं सापेक्ष आयात निम्नलिखित की कोशिश की, लेकिन यह काम नहीं करता: from ...util.utiltest import *

मैं हमेशा ValueError: Attempted relative import beyond toplevel package

कैसे इस तरह के एक multileve रिश्तेदार आयात करने के लिए मिल सकता है?

+1

सापेक्ष आयात क्यों? एक पूर्ण आयात यह करने का सबसे आसान तरीका होना चाहिए;): 'उपयोग से। आयात आयात *' –

उत्तर

12

आप top की पैरेंट फ़ोल्डर से foobar आयात करना होगा:

import top.foo.bar.foobar 

यह अजगर बताता है कि top शीर्ष स्तर पैकेज है। संबंधित पैकेज केवल पैकेज के अंदर ही संभव है।

11

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि स्वीकृत उत्तर संभावित रूप से प्रश्नकर्ता के कोड के साथ मुख्य मुद्दे को याद करता है। यह गलत नहीं है, कड़ाई से बोल रहा है, लेकिन यह एक सुझाव देता है कि केवल वास्तविक मुद्दे के आसपास काम करने के लिए संयोग से होता है।

वह वास्तविक मुद्दा यह है कि foobar.pytop\foo\bar में फ़ाइल को एक स्क्रिप्ट के रूप में चलाया जा रहा है। जब एक (सही!) सापेक्ष आयात का प्रयास किया जाता है, तो यह विफल हो जाता है क्योंकि पाइथन दुभाषिया पैकेज संरचना को समझ में नहीं आता है।

इसके लिए सबसे अच्छा ठीक foobar.py फ़ाइल नाम से नहीं चलाने के लिए है, लेकिन इसके बजाय दुभाषिया के लिए -m ध्वज का उपयोग करने के top.foo.bar.foobar मॉड्यूल को चलाने के लिए यह बताने के लिए। इस तरह पाइथन को पता चल जाएगा कि यह लोड होने वाला मुख्य मॉड्यूल पैकेज में है, और यह पता चलेगा कि सापेक्ष आयात कहां रेफर कर रहा है।

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