software - python tutorial pdf




क्या कोई पाइथन के सापेक्ष आयात की व्याख्या कर सकता है? (2)

मैं अपने जीवन के लिए काम करने के लिए पाइथन के सापेक्ष आयात नहीं कर सकता। मैंने एक सरल उदाहरण बनाया है जहां यह कार्य नहीं करता है:

निर्देशिका संरचना है:

/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py

/start.py में बस है: import sub.relative

/sub/relative.py from .. import parent केवल from .. import parent

अन्य सभी फाइलें खाली हैं।

कमांड लाइन पर निम्न निष्पादित करते समय:

$ cd /
$ python start.py

मुझे मिला:

Traceback (most recent call last):
  File "start.py", line 1, in <module>
    import sub.relative
  File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
    from .. import parent
ValueError: Attempted relative import beyond toplevel package

मैं पायथन 2.6 का उपयोग कर रहा हूँ। यह एक केस क्यों है? मैं इस सैंडबॉक्स उदाहरण को कैसे काम करूं?


आप पैकेज "सब" से आयात कर रहे हैं। start.py एक पैकेज में नहीं है भले ही एक __init__.py मौजूद है।

आपको parent.py पर एक निर्देशिका से अपना प्रोग्राम शुरू करना होगा:

./start.py

./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py

start.py साथ:

import pkg.sub.relative

अब पीकेजी शीर्ष स्तर का पैकेज है और आपके रिश्तेदार आयात को काम करना चाहिए।

यदि आप अपने वर्तमान लेआउट से चिपकना चाहते हैं तो आप केवल import parent उपयोग कर सकते हैं। चूंकि आप अपना दुभाषिया लॉन्च करने के लिए start.py का उपयोग करते हैं, निर्देशिका जहां start.py स्थित है, आपके पायथन पथ में है। parent.py एक अलग मॉड्यूल के रूप में वहाँ रहता है।

यदि आप निर्देशिका स्क्रिप्ट को और स्क्रिप्ट में कुछ भी आयात नहीं करते हैं, तो आप शीर्ष स्तर __init__.py को सुरक्षित रूप से हटा भी सकते हैं।


यदि आप सीधे sys.path को कॉल करने जा रहे हैं और यानी यदि आप वास्तव में शीर्ष स्तर के मॉड्यूल से आयात करना चाहते हैं तो आपको इसे sys.path सूची में स्पष्ट रूप से जोड़ना होगा।
यहां बताया गया है कि इसे कैसे काम करना चाहिए:

# Add this line to the beginning of relative.py file
import sys
sys.path.append('..')

# Now you can do imports from one directory top cause it is in the sys.path
import parent

# And even like this:
from parent import Parent

यदि आपको लगता है कि उपर्युक्त किसी प्रकार की असंगतता का कारण बन सकता है तो आप इसके बजाय इसका उपयोग कर सकते हैं:

sys.path.append(sys.path[0] + "/..")

sys.path[0] पथ को संदर्भित करता है कि प्रविष्टि बिंदु से भाग गया था।





python