साइथपथ में पायथन मॉड्यूल कैसे जोड़ें?


68

मैं इस तरह एक फ़ाइल संरचना है:

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

मैं में आयात करना चाहते हैं foo2.py और foo1.py। मैंने कोशिश की, लेकिन यह उबंटू पर काम नहीं करता है:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py

क्या __init__.pyआपके फोल्डर में फाइल है? यह कैसे अजगर पैकेज बनाता है और आपको उस पैकेज से मॉड्यूल आयात करने की अनुमति देता है। guide.python-distribute.org/creation.html
ब्रायन

मेरे पास कॉमन और टेस्टफॉर्ड में init.py फ़ाइल है
user284474

यदि आप आयात करना चाहते हैं तो आपको फ़ोल्डर निर्देशिका के साथ-साथ उप फ़ोल्डर में भी इसकी आवश्यकता है
ब्रायन

यह init .py खाली है?
user284474

1
हाँ, यह खाली हो सकता है। जब तक आपको अपने पैकेज के लिए एक निश्चित कॉन्फ़िगरेशन की आवश्यकता होती है, लेकिन आपको खाली होने के साथ ठीक होना चाहिए
ब्रायन

जवाबों:


114

कैसे अजगर अपने मॉड्यूल पाता है

कड़ाई से लिया गया, एक मॉड्यूल एक अजगर फ़ाइल है, जबकि एक पैकेज एक फ़ोल्डर है जिसमें अजगर फाइलें होती हैं, नाम के साथ एक (खाली हो सकती है) फ़ाइल होती है __init__.py, अजगर को बताने के लिए यह मॉड्यूल से आयात करने के लिए एक पैकेज है। दोनों ही मामलों में, मॉड्यूल को उनके .pyविस्तार की आवश्यकता होती है , लेकिन उन्हें आयात किए बिना किया जाता है (नीचे और देखें)।

डिफ़ॉल्ट रूप से, पायथन अपने मॉड्यूल और पैकेज की तलाश करता है $PYTHONPATH

$ PYTHONPATH में क्या शामिल है, यह जानने के लिए, अजगर में निम्नलिखित कोड चलाएँ (3):

import sys
print(sys.path)

डायरेक्टरी कैसे जोड़े

कभी कभी

एक अजगर फ़ाइल के भीतर से, आप अपने अजगर आवेदन या स्क्रिप्ट के मुख्य भाग में निम्नलिखित पंक्तियों को जोड़कर कभी-कभी डिफ़ॉल्ट पथ पर पथ जोड़ सकते हैं:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

उदाहरण के लिए:

यदि मेरे पास एक फ़ोल्डर है: /home/myname/pythonfilesऔर मैं module_1.pyउस निर्देशिका में स्थित फ़ाइल को आयात करना चाहता हूं, तो मैं इसे अपने कोड के मुख्य भाग में जोड़ता हूं:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

और मैं बस module_1.pyद्वारा फ़ाइल आयात कर सकते हैं :

import module_1

जब मैं एक पैकेज बनाता हूं और पैकेज से मॉड्यूल आयात करना चाहता हूं, तो मुझे एक फ़ोल्डर बनाने की आवश्यकता है $PYTHONPATH, जिसमें मॉड्यूल शामिल हैं, एक (खाली हो सकता है) फ़ाइल के साथ कहा जाता है__init__.py

उदाहरण के लिए:

एक पैकेज (फ़ोल्डर) कहा जाता है से आयात करने के लिए my_packageमें /home/myname/pythonfiles, जोड़ने के /home/myname/pythonfilesअपने के लिए पथ $PYTHONPATH, उदाहरण 1 में की तरह, और मॉड्यूल बुलाया आयात module_2.py(पैकेज फ़ोल्डर के अंदर) बस के साथ: `

from <packagename> import module_2

निर्देशिकाओं को $PYTHONPATHस्थायी रूप से जोड़ना :

अपनी ~/.profileफ़ाइल में निम्न पंक्ति जोड़ें ।

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

उप-निर्देशिकाएं

एक पैकेज के भीतर से, उपनिर्देशिकाएं उस तरह शामिल नहीं हैं; आपको निर्देशिकाओं को "चेन" करने की आवश्यकता है। एक मॉड्यूल आयात करने के लिए module_3.py, फ़ोल्डर के subfolderअंदर फ़ोल्डर के अंदर packagename:

import packagename.subfolder.module_3

इस तथ्य को देखते हुए कि पैकेज में सभी सबफ़ोल्डर्स में अपनी __init__.pyफ़ाइल शामिल है।

जब एक मॉड्यूल स्क्रिप्ट या एप्लिकेशन के समान निर्देशिका में होता है

जब स्क्रिप्ट या एप्लिकेशन के समान निर्देशिका में है, तो मॉड्यूल को पथ सम्मिलित करने की कोई आवश्यकता नहीं है, यह स्वचालित रूप से जोड़ा जाता है।

उदाहरण:

अगर मेरे पास एक फ़ोल्डर है, जिसमें मैं script.pyऔर module.pyमैं बस मॉड्यूल आयात कर सकता हूं:

import module

मैं आपको python.org/dev/peps/pep-0328 पढ़ने का सुझाव देना चाहूंगा , विशेषकर तब जब आप पायथन 3 को लक्षित कर रहे हों (या भविष्य में लक्षित करने की योजना बना रहे हों)
zaadeh

printenv PYTHONPATHकुछ भी क्यों नहीं है?
स्टीवी जी

1
sys.path.append("/path/to/your/package_or_module")डिफ़ॉल्ट में एक पथ भी जोड़ता है और यह कम भ्रामक है। sys.path.insert(0,...)जिसकी तुलना में 0पहले तर्क के रूप में है।
पॉल रौजीक्स

1
@PaRRougieux: पथ को जोड़ने के साथ समस्या यह है कि आपका मॉड्यूल पहले से ही पथ में कहीं मौजूद हो सकता है (उदाहरण के लिए एक inegg फ़ाइल) और आप अपनी फ़ाइल में एक के बजाय अपने मॉड्यूल के उस संस्करण को उठाएंगे।
स्नार्क

6

रिश्तेदार आयात का उपयोग करने का सही तरीका है:

from ..Common import foo1

और आपको __init__.pyअपने सभी फ़ोल्डर्स में भी आवश्यकता है ।


1
धन्यवाद। लेकिन अगर मेरे पास एक मॉड्यूल है जो दो फ़ोल्डर्स है तो मैं इसे कैसे आयात करूं? से .... फ़ोल्डर काम नहीं कर रहा है
user284474

क्या यह एक स्तर के साथ काम करता है?
सिल्वेन पिनेउ

एकल स्तर के साथ यह काम करता है।
user284474

ठीक है, क्या आप इस उत्तर को स्वीकार कर सकते हैं? बहुस्तरीय के लिए हालांकि आप एक अलग प्रश्न पूछ सकते हैं, लेकिन पहले इस प्रश्न पर एक नज़र डालें और इस उत्तर को अपने मॉड्यूल को पैकेज के अंदर बुलाने का सबसे अच्छा तरीका है
सिल्वेन पिनेउ

क्या यह पायथन 2 या पायथन 3 के लिए सही है? अथवा दोनों?
एलेक्स

2

NB: यह उत्तर अजगर 3 के नवीनतम संस्करण के लिए पुराना है, लेकिन पहले के संस्करण के लिए यहाँ है। अधिक जानकारी के लिए टिप्पणियों और https://www.python.org/dev/peps/pep-0420/ को पढ़ें


अजगर कोड के साथ अनिवार्य रूप से हर फ़ोल्डर जिसे आप syspath में जोड़ना चाहते हैं, उसे __in____.py फ़ाइल चाहिए। ये __init__.py फाइलें खाली हो सकती हैं।


जैसा कि मैंने इसे समझा, यह अब ऐसा नहीं है, निर्देशिका अब एक "नामस्थान" बन गई है।
आरोन हॉल

@AaronHall दिलचस्प, स्रोत?
don.joey

1
सबूत के लिए यह कोशिश करें: python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"यहां कुछ प्रासंगिक दस्तावेज, PEP 420, जो नामस्थान पैकेज शब्दार्थ के अतिरिक्त का वर्णन करता है
हारून हॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.