सबफ़ोल्डर से मॉड्यूल आयात करें


104

मैं मॉड्यूल के रूप में सबफ़ोल्डर आयात करना चाहता हूं। इसलिए हर सबफ़ोल्डर में a __init__.py। मेरी फ़ोल्डर संरचना इस प्रकार है:

src\
  main.py
  dirFoo\
    __init__.py
    foofactory.py
    dirFoo1\
      __init__.py
      foo1.py
    dirFoo2\
      __init__.py
      foo2.py

अपनी मुख्य स्क्रिप्ट में मैं आयात करता हूं

from dirFoo.foofactory import FooFactory

इस कारखाने की फाइल में मैं उप मॉड्यूल शामिल हैं:

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2

अगर मैं अपनी फ़ॉफ़ेक्टिंग को कॉल करता हूं तो मुझे त्रुटि मिलती है, कि अजगर सबमोड्यूल्स foo1 और foo2 को आयात नहीं कर सकता है:

Traceback (most recent call last):
  File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
  File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in    <module>
from dirFoo1.foo1 import Foo1
    ImportError: No module named dirFoo1.foo1

जवाबों:


136

अपने PYTHONPATHया sys.pathयहाँ के साथ गड़बड़ करने की कोई आवश्यकता नहीं है।

पैकेज में निरपेक्ष आयात का ठीक से उपयोग करने के लिए आपको "रूट" पैकेजेजेन को शामिल करना चाहिए, जैसे:

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2

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

from .dirfoo1.foo1 import Foo1
from .dirfoo2.foo2 import Foo2

47
एक बात याद रखना! __init__.pyआपके द्वारा आयात किए जा रहे हर सबफ़ोल्डर में जोड़ें ।
अजीज आल्टो

6
खाली __init__.pyकाम कर सकते हैं।
cerebrou

1
यदि पहले Foo1मूल निर्देशिका में था और एक को कुछ कोडित किया जाए तो वाक्य रचना क्या होगी from Foo1 import *। वहाँ एक ही प्रभाव को प्राप्त करने के लिए एक रास्ता है ताकि आप के साथ सब कुछ उपसर्ग नहीं है Foo1?
jxramos

1
@AzizAlto: आपकी टिप्पणी के बिना यह समाधान बहुत उपयोगी नहीं है
एलेक्स

21

बस यहाँ सूचित करने के लिए। (एक newbee, keviv22 से)

अपने स्वयं के अच्छे के लिए कभी भी और कभी भी, "-" या "_" जैसे प्रतीकों के साथ फ़ोल्डर्स या फ़ाइलों का नाम न दें। यदि आपने ऐसा किया, तो आपको कुछ मुद्दों का सामना करना पड़ सकता है। जैसे मेरा कहना है, हालाँकि आयात करने की आपकी आज्ञा सही है, लेकिन आप वांछित फ़ाइलों को सफलतापूर्वक आयात करने में सक्षम होंगे जो कि इस तरह के नामित फ़ोल्डर के अंदर उपलब्ध हैं।

निम्नानुसार अमान्य फ़ोल्डर नाम:

  • जेनेरिक-वर्ग-फ़ोल्डर
  • Generic_Classes_Folder

उपरोक्त के लिए मान्य फ़ोल्डर नाम:

  • GenericClassesFolder या Genericclassesfolder या genericClassesFolder (या बिना किसी रिक्त स्थान या इस तरह के शब्दों के बीच विशेष प्रतीकों)

मैंने क्या गलती की:

फ़ाइल संरचना पर विचार करें।

Parent
   . __init__.py
   . Setup
     .. __init__.py
     .. Generic-Class-Folder
        ... __init__.py
        ... targetClass.py
   . Check
     .. __init__.py
     .. testFile.py

मैं क्या करना चाहता था?

  • testFile.py से, मैं 'targetClass.py' फ़ाइल में "functionExecute" नाम के फंक्शन का उपयोग करने के लिए जेनेरिक-क्लास-फोल्डर फ़ाइल के अंदर 'targetClass.py' फ़ाइल आयात करना चाहता था।

मैंने क्या किया?

  • 'testFile.py' से, कमांड लिखा, from Core.Generic-Class-Folder.targetClass import functionExecute
  • जैसी त्रुटियां मिलीं SyntaxError: invalid syntax

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

और एक लंबे लंबे लंबे समय के बाद, मैंने अपने एक दोस्त के साथ बात करते हुए यह पता लगाया। ऐसे नामकरण सम्मेलनों का उपयोग करने के लिए मैं थोड़ा बेवकूफ हूं। मुझे किसी भी फ़ोल्डर या फ़ाइल के नाम को परिभाषित करने के लिए कभी भी स्थान या विशेष प्रतीकों का उपयोग नहीं करना चाहिए। तो, यह वही है जो मैं व्यक्त करना चाहता था। आपका दिन शुभ हो!

(इस पर बड़ी पोस्ट के लिए खेद है ... बस मेरी कुंठाओं को जाने दें .... :) धन्यवाद!


22
रिक्त स्थान और डैश ("-") इसका कारण होगा, लेकिन अंडरस्कोर ("_") अभी भी ठीक काम करना चाहिए।
काउसलिनट

6

अपना PYTHONPATH पर्यावरण चर सेट करें। उदाहरण के लिए इस तरह PYTHONPATH =।: .. (* निक्स परिवार के लिए)।

इसके अलावा आप अपने वर्तमान निर्देशिका (अपने मामले में src) को pythonpath में मैन्युअल रूप से जोड़ सकते हैं:

import os
import sys
sys.path.insert(0, os.getcwd())

2

मान लें कि आपकी परियोजना इस प्रकार संरचित है:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

अंदर run.py, आप स्क्रिप्ट को एक और दो से आयात कर सकते हैं:

from subscripts import script_one as One
from subscripts import script_two as Two

अब, अभी भी अंदर run.py, आप उनके तरीकों को कॉल कर पाएंगे:

One.method_from_one(param)
Two.method_from_two(other_param)

1

बस एक खाली ___init____.py फ़ाइल बनाएं और इसे रूट के साथ-साथ अपने पायथन एप्लिकेशन के सभी उप निर्देशिका / फ़ोल्डर में जोड़ें जहां आपके पास अन्य पायथन मॉड्यूल हैं।


-2

था समस्याओं यहां तक कि जब init सबफ़ोल्डर में ही अस्तित्व में है और .py कि सभी आयात के बाद 'के रूप में' जोड़ने था याद आ रही थी

from folder.file import Class as Class
import folder.file as functions
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.