2011-11-16 20 views
5

मैं एक परियोजना है जो इस तरह दिखता है:पायथन मॉड्यूल में पूर्ण आयात विफल रहता है

my_project/ 
      __init__.py -- empty 
      run.py 
      datacheck/ 
        __init__.py -- empty 
        datacheck.py -- containing class DataCheck(object) 
        config.py -- containing BusinessConfig(object) 
        business.py -- containing class BusinessCheck(DataCheck) 

मेरे PYTHONPATH उस में है/my_project के लिए कॉन्फ़िगर है।

run.py में, मैं निम्नलिखित कोड है:

from datacheck.business import BusinessCheck 
business = BusinessCheck() 
business.check_data() 

business.py में, मैं निम्नलिखित आयात कि असफल है:

from datacheck.config import BusinessConfig 
from datacheck.datacheck import DataCheck 

from .config import BusinessConfig काम करता है की तरह एक रिश्तेदार आयात - लेकिन मैंने कई धागे में पढ़ा है कि एक पूर्ण आयात पसंद किया जाता है।

myproject/ 
      __init__.py -- empty 
      run_test.py 
      test/ 
       __init__.py -- empty 
       test1.py -- containing class Test1(object) 
       test2.py -- containing class Test2(Test1) 

run_test.py आयात और Test2 वर्ग चलाता है, यह असफल नहीं किया:

एक साधारण परीक्षण करने के लिए, मैं भी निम्नलिखित बनाया।

यह मुझे थोड़ा सा झटका लगा, मुझे समझ में नहीं आता कि डेटाशैक में मेरा पूर्ण आयात क्यों काम नहीं कर रहा है - क्या कोई समझा सकता है?

+0

'datacheck.business import Business' से' business.py - क्लास बिजनेस चेक (डेटा चेक) युक्त वर्ग 'वर्ग' व्यवसाय कहां है? – eumiro

+0

क्या आपके पास 'datacheck' में '__init __। Py' फ़ाइल भी है? यह फ़ाइल निर्देशिका को एक पैकेज बनाती है, और खाली हो सकती है। –

+0

@ यूमिरो: क्षमा करें, छोटी गलती - इसे सही करें। –

उत्तर

6

documentation में बताए गए अनुसार, यदि आपका मॉड्यूल __main__ के रूप में उपयोग किया जा सकता है, तो आपको पूर्ण आयात पसंद करना चाहिए। यदि नहीं, सापेक्ष आयात ठीक हैं।

ये आयात विफल हो गए हैं, क्योंकि आपके पैकेज datacheck में एक मॉड्यूल datacheck (समान नाम) है। नाम की तलाश करते समय, पायथन पूरी तरह से पैकेज के अंदर दिखता है। वहां, यह मॉड्यूल datacheck पाता है। हालांकि, इस मॉड्यूल में config नाम के साथ कुछ भी शामिल नहीं है, इसलिए आयात विफल हो जाता है।

यदि आप पूर्ण आयात का उपयोग करना चाहते हैं, तो मॉड्यूल datacheck से सभी सामान को पैकेज के __init__.py में ले जाएं, या उसका नाम बदलें।

+0

करता हूं कि (डेटाशैक में डेटाशैक) यह सब कुछ था, मुझे कभी नहीं पता था कि यह संभव नहीं था! धन्यवाद एक गुच्छा :-) –

+0

@SjaakTrekhaak: यह संभव है, लेकिन यह एक अस्पष्टता पैदा करता है, इसलिए आपको सावधान रहना होगा। –

2

मैं जानता हूँ कि यह कई साल बाद है, लेकिन यहाँ खोज कर दूसरों की खातिर, मैं कोड के इस बिट के साथ एक समान समस्या को हल करने में सक्षम था:

from __future__ import absolute_import 

उसके बाद, पूर्ण आयात में ठीक काम किया पायथन 2.6 और 2.7।

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