2015-12-25 11 views
23

नामक कोई मॉड्यूल नहीं है, मैं पाइथन के लिए नया हूं और मैं एक समस्या को समझने की कोशिश कर रहा हूं, जिसे मैं पैकेज बनाते समय देखता हूं। मेरे पास निम्न फ़ाइल संरचना: (कार्य-निर्देशिका/मेरी/पायथन/jmLib2)पायथन 3: आयात त्रुटि: xxxx

/my/Python/jmLib2 
    |--- Phone 
    |  |--- __init__.py 
    |  |--- Pots.py 
    |- Test2.py 

--------------------------------- 
cat ./jmLib2/Pots.py 
#!/usr/bin/python 

def Pots(): 
    print ("I'm Pots Phone") 

--------------------------------- 
cat ./jmLib2/__init__.py 
from Pots import Pots 

--------------------------------- 
cat ./Test2.py 
#!/usr/bin/python 
from Phone import Pots 

import os.path 
print ("OS:"+str(os.path)) 

Pots() 

जब मैं अब क्या:

python2 Test2.py 
OS:<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'> 
    I'm Pots Phone* 

महान ... लेकिन, अगर मैं करें:

python3 Test2.py 
Traceback (most recent call last): 
    File "Test2.py", line 2, in <module> 
    from Phone import Pots 
    File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in <module> 
    from Pots import Pots 
ImportError: No module named 'Pots' 

मैं ग्रहण के तहत पायडेव के साथ काम कर रहा हूं। PyDev मुझे init के अंदर रिपोर्ट करता है .py फ़ाइल "अनसुलझा आयात: बर्तन" -error। मेरे पास PyDev और bash के अंतर्गत एक ही ट्रेसबैक-समस्या है।

फिर से, मैं पाइथन के लिए नया हूं ... इसलिए यह शायद एक बहुत बेवकूफ गलती है। लेकिन क्या कोई मुझे बता सकता है, पायथन 2 और पायथन 3.4 के बीच का अंतर? क्या मुझे PythonPATH को संशोधित करना है? क्यूं कर?

अभिवादन जुएर्गेन

उत्तर

33

टी एल; डॉ:Relative imports are gone। इसके बजाय पूर्ण आयात का उपयोग करें।

या तो उपयोग:

from Phone.Pots import Pots 

या:

from .Pots import Pots 

समस्या होती है क्योंकि PotsPhone पैकेज का हिस्सा है: कोई Pots नामित मॉड्यूल है, वहाँ Phone.Pots नाम के एक मॉड्यूल है ।

पायथन 2 में relative imports नामक एक सुविधा थी जो आपको import Pots लिखने देती है, भले ही वह तकनीकी रूप से सही न हो।

  • कौन कोड पढ़ता तुरंत यह नहीं कह सकते कि क्या आयात या नहीं एक पैकेज से है:

    सापेक्ष आयात तथापि problems and confusion का स्रोत रहे हैं।

  • मॉड्यूल का नाम Phone.Pots नाम दिया गया है, लेकिन मैं import Pots का उपयोग कर सकता हूं? यह बेहद असंगत है।
  • क्या होगा यदि सबमिशन दूसरे मॉड्यूल का नाम छाया करता है?

इन कारणों से, रिश्तेदार आयात पायथन 3. से हटा दिया गया


आप एक __future__ import का उपयोग करके अजगर 2 से रिश्तेदार के आयात से छुटकारा पाने के कर सकते हैं: के लिए ठनक:

from __future__ import absolute_import 
+0

एंड्रिया तेज़ और विस्तृत उत्तर। – MatrixClient

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