2013-12-15 5 views
11

में __init.py__ नाम की फ़ाइल के साथ भी मुझे पता है कि इस प्रश्न को कई बार पूछा गया है और मैंने शायद अधिकांश उत्तरों को पढ़ा है (this और that सहित) साथ ही साथ पायथन दस्तावेज लेकिन अभी भी मेरी बहुत ही साधारण आयात समस्या का उत्तर नहीं मिल रहा है। यह इतना आसान है कि मुझे कुछ बेवकूफ याद आना चाहिए लेकिन मुझे अभी तक यह नहीं दिख रहा है। मैं सेटअप निम्नलिखित संरचना है:पाइथन उपनिर्देशिका से मॉड्यूल आयात नहीं कर सकता है, यहां तक ​​कि

myproject 
    myscript.py 
    MyPackage 
     __init.py__ 
     mymodule.py 

मैं सिर्फ myscript.py से mymodule.p y (या कमांडलाइन अजगर दुभाषिया जो एक ही होना चाहिए) लोड करना चाहते हैं।

myscript.py शामिल हैं:

#!/usr/bin/python 
import MyPackage 

__init.py__ शामिल हैं:

from . import mymodule 

mymodule.py शामिल

#!/usr/bin/python 

def myfunction(): 
    print "mymessage" 

मेरा लक्ष्य myscript.py से myfunction कॉल करने के लिए है, लेकिन अगर मैं करने की कोशिश मॉड्यूल फोन मैं

$python myscript.py 
Traceback (most recent call last): 
    File "myscript.py", line 2, in <module> 
    import MyPackage 
ImportError: No module named MyPackage 

क्या मैं पहले से ही करने की कोशिश की:

  • मैं तहत OSX और उबंटू लिनक्स सब कुछ करने की कोशिश की एक दोषपूर्ण अजगर स्थापना की संभावना को कम करने के लिए।
  • मैंने PYTHONPATH पर्यावरण चर myproject निर्देशिका के साथ-साथ . और दोनों को सेट किया है।
  • मैं __init.py__ खाली छोड़ दिया
  • मैं आयात बयान करने की कोशिश की भी अजगर दुभाषिया से myproject निर्देशिका
  • मैं निम्नलिखित आयात बयान करने की कोशिश की से शुरू:

    from MyPackage import mymodule 
    import MyPackage.mymodule 
    import MyPackage.mymodule as module 
    

    सभी सफलता के बिना (एक ही त्रुटि संदेश)।

अगर मैं एक पैकेज का उपयोग किए बिना परियोजना निर्देशिका में mymodule.py शब्दों में कहें, आयात ठीक काम करता है। लेकिन मुझे नहीं पता कि सबपैकेज से आयात क्यों काम नहीं कर रहा है। कोई विचार है कि मैं इसे कैसे काम कर सकता हूं?

मदद के लिए धन्यवाद!

+0

आपको यह सत्यापित करने की आवश्यकता है कि 'myproject' निर्देशिका' sys.path' में सूचीबद्ध है या नहीं। 'MyPackage' आयात करने से पहले, क्या sys.path' में सही निर्देशिका है? –

+0

यदि मैं दुभाषिया शुरू करता हूं और 'आयात sys' और' print sys.path 'निष्पादित करता हूं तो यह एक सूची को "myproject" निर्देशिका का पथ सही ढंग से दिखाता है:' ['', '/ उपयोगकर्ता/माइकल/Entwicklung/पायथन/myproject ', ...] ' – mhelwig

+0

सही, तो पैकेज आयात योग्य होना चाहिए। पैकेज * में * * अलग * आयात त्रुटि * हो सकती है। आपने कहा है कि आपने पहले ही खाली '__init __। Py' की कोशिश की है। क्या आप इसे फिर से कोशिश कर सकते हैं, लेकिन सुनिश्चित करें कि आप सभी '* .pyc' फ़ाइलों को हटा दें। शायद '__init __। Py' में एक 'प्रिंट' आयातित" 'पंक्ति जोड़ें। –

उत्तर

7

अपनी पोस्ट के स्वरूपण को संपादित करते समय, मैंने देखा कि आप अपनी फ़ाइल __init.py_ पर कॉल कर रहे हैं। इससे पाइथन आपके MyPackage निर्देशिका को पैकेज के रूप में पहचानने का कारण बनता है, इसलिए ImportError: No module named MyPackage

यह बजाय होना चाहिए __init__.py (नाम __init__, विस्तार .py)। फिर यह काम करेगा, आपकी परियोजना संरचना और आयात विवरण अन्यथा सही हैं।

हालांकि एक मामूली बिंदु: आपको अपने पैकेज नामकरण के लिए lower_underscore शैली का भी उपयोग करना चाहिए। पैकेज पाइथन में मॉड्यूल भी हैं, और उन्हें समान नामकरण सम्मेलनों का पालन करना चाहिए। अनुशंसित शैली और नामकरण सम्मेलनों के विवरण के लिए PEP8 देखें। यह सिर्फ सम्मेलन है, हालांकि, इसकी आपकी समस्या से कोई लेना देना नहीं है।

+0

पायथन केस संवेदनशील है इसलिए पैकेज संरचना और आयात विंडोज के तहत भी मेल नहीं खाएंगे। –

+0

निश्चित रूप से यह है, और वे पूरी तरह से उनके विवरण में मेल खाते हैं: वह पैकेज 'माईपैकेज' कहते हैं और इसे 'आयात माईपैकेज' के रूप में आयात करते हैं, और मॉड्यूल 'mymodule.py' और आयात करता है या इसे 'से आयात करता है .. मेरा आयात करें' । मॉड्यूल और पैकेज के बीच आवरण को समन्वयित करना पूरी तरह से अनावश्यक है। –

+1

वाह, मैं वास्तव में प्रभावित हूं कि मैंने इस समस्या से जूझने में तीन या अधिक घंटे बिताए और दस्तावेज को बार-बार पढ़ते हुए मैंने पूरी तरह से '__init __। Py' के गलत नामकरण को अनदेखा कर दिया जिसे आपने देखा था। उत्तम! अब यह अंत में काम करता है, तो आपके उत्तर के लिए धन्यवाद! – mhelwig

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