उसी निर्देशिका या उप निर्देशिका के भीतर वर्ग को कैसे आयात करें?


675

मेरे पास एक निर्देशिका है जो सभी .py फ़ाइलों को संग्रहीत करती है।

bin/
   main.py
   user.py # where class User resides
   dir.py # where class Dir resides

मैं से कक्षाओं का उपयोग करना चाहते user.py और dir.py में main.py
मैं इन पायथन कक्षाओं को मेनफ्रेम में कैसे आयात कर सकता हूं ?
इसके अलावा, Userयदि उपयोगकर्ता एक उप निर्देशिका में है तो मैं कक्षा को कैसे आयात कर सकता हूं ?

bin/
    dir.py
    main.py
    usr/
        user.py


जवाबों:


937

अजगर २

__init__.pyफ़ाइलों के रूप में एक ही निर्देशिका में एक खाली फ़ाइल बनाओ । यह पायथन को सूचित करेगा कि यह "इस निर्देशिका से आयात करने के लिए ठीक है"।

तो बस करो ...

from user import User
from dir import Dir

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

bin/
    main.py
    classes/
        user.py
        dir.py

इसलिए यदि निर्देशिका को "कक्षाएं" नाम दिया गया था, तो आप यह करेंगे:

from classes.user import User
from classes.dir import Dir

अजगर ३

पिछले की तरह ही, लेकिन .उपनिर्देशिका का उपयोग न करने पर मॉड्यूल नाम के साथ उपसर्ग करें :

from .user import User
from .dir import Dir

14
तो __init__.pyहै नहीं खाली है, तो जो कुछ भी है __init__.pyहै जब आप पैकेज आयात (और में आयात नहीं बातें क्या उपलब्ध हो जाएगा __init__.pyसब पर उपलब्ध नहीं होगा)।
एम्बर

23
किसी __init__.pyफ़ाइल की आवश्यकता क्यों है ? अगर मैं एक ही डायरेक्टरी में तीनों फाइलें डालूं और चलाऊं main.py, तो यह importअन्य दो मॉड्यूल्स के बिना भी ठीक है। मैं क्या खो रहा हूँ?
मार्टीन्यू

30
क्योंकि यही पाइथन उन निर्देशिकाओं की पहचान करता है जिनसे आपको आयात करने की अनुमति है। आपके द्वारा चलाए जा रहे स्क्रिप्ट की निर्देशिका एक अपवाद है - आपको हमेशा इससे आयात करने की अनुमति है।
अंबर

20
@nbro और एम्बर: एफडब्ल्यूआईडब्ल्यू, मुझे लगता है कि सूक्ष्म __init__.pyऔर उसी निर्देशिका में अन्य मॉड्यूल आयात करने में सक्षम होने के साथ कुछ बदल गया है । विशेष importरूप से एक ही निर्देशिका में अन्य मॉड्यूलों की __init__.pyफाइल के रूप में जो पायथन 2.7.8 में काम करती है, पायथन 3.4.1 में विफल रही। इसे ठीक करने के लिए मुझे उनमें से प्रत्येक को उपनिर्देशिका के नाम और एक डॉट के साथ उपसर्ग करना था (यानी import moduleबदलना पड़ा import subdirectory.module)। सौभाग्य से यह ऐसा करने के बाद भी पायथन 2.7.8 में काम किया।
मार्टिन डे

4
मैं पुष्टि कर सकता हूं कि यह समाधान अब क्रियाशील नहीं है। आप इसे सही, संशोधित या एकमुश्त हटाना चाह सकते हैं।
लुइस डी सोसा

137

मैंने अभी सीखा ( मार्टीनो की टिप्पणी के लिए धन्यवाद ), उसी निर्देशिका में फ़ाइलों से कक्षाएं आयात करने के लिए, अब आप पायथन 3 में लिखेंगे:

from .user import User
from .dir import Dir

8
अगर मैं यह कोशिश करता हूं कि मुझे निम्नलिखित त्रुटि न मिले ValueError: Attempted relative import in non-packageलेकिन जब मैं बदल जाता हूं तो त्रुटि दूर हो जाती हैfrom user import User
Korpel

मैं .fileloader से आयात करता हूँ Fileloader आयात करता हूँ और ImportError प्राप्त करता हूँ: '
Fileloader

3
@Korpel: stackoverflow.com/questions/11536764// में चर्चा के बाद मुझे पता चलता है कि ऊपर दिए गए आयात कार्यों को पूरा करने या न करने पर निर्भर करता है: [1] कैसे आपकी स्क्रिप्ट को कहा जाता है (पैकेज के रूप में या नहीं) [२] वास्तविक कार्य पथ तब होता है जब आप इसे निष्पादित करते हैं [3] कि आपके रन पर्यावरण का पथ चर कैसे आबाद होता है
ecp

@ कोर्पेल: मैंने देखा कि द। मॉड्यूल नाम से पहले आवश्यक है जब एक init .py फ़ाइल मौजूद है, यदि नहीं। / छोड़ा जा सकता है।
MUG4N

39

अपने में main.py:

from user import Class

Classउस वर्ग का नाम कहां है जिसे आप आयात करना चाहते हैं।

यदि आप किसी विधि को कॉल करना चाहते हैं Class, तो आप इसका उपयोग करके कॉल कर सकते हैं:

Class.method

ध्यान दें कि एक __init__.pyही निर्देशिका में एक खाली फ़ाइल होनी चाहिए ।


1
यदि आप जिस मॉड्यूल को आयात करने का प्रयास कर रहे हैं, उसका कोई वर्ग नहीं है तो आप क्या करते हैं? सिर्फ कच्चे कार्य? अजगर 2 में मुझे केवल 'इंपोर्ट मॉड्यूल' करना था। अजगर 3 में काम नहीं करता, न तो 'आयात .module' करता है
Frikster

2
हटाए जाने के बाद यह python3 में काम करता है __init__.py
इंजनफोर्स

13

यदि आप अपने साथ फ़ंक्शंस और क्लासेस को मिक्स नहीं करना चाहते हैं तो आप मॉड्यूल को इम्पोर्ट कर सकते हैं और इसके नाम से एक्सेस कर सकते हैं

import util # imports util.py

util.clean()
util.setup(4)

या आप अपने कोड में फ़ंक्शन और कक्षाएं आयात कर सकते हैं

from util import clean, setup
clean()
setup(4)

आप अपने कोड के लिए उस मॉड्यूल में सब कुछ आयात करने के लिए वाइल्डचार * का उपयोग कर सकते हैं

from util import *
clean()
setup(4)

10

Python3 में, __init__.pyहै नहीं रह गया है आवश्यक । यदि कंसोल की वर्तमान निर्देशिका वह निर्देशिका है जहां अजगर स्क्रिप्ट स्थित है, तो सब कुछ ठीक काम करता है

import user

हालाँकि, यह काम नहीं करेगा यदि एक अलग निर्देशिका से बुलाया जाता है, जिसमें शामिल नहीं है user.py
उस मामले में, का उपयोग करें

from . import user

यह तब भी काम करता है, जब आप वहां से सिर्फ एक क्लास के बजाय पूरी फाइल आयात करना चाहते हैं।


2
मैं बनाम कोड में pylint का उपयोग कर रहा हूं, और एक ही-निर्देशिका आयात के साथ हमेशा एक त्रुटि के रूप में चिह्नित किया जा रहा import userथा ( लाल रंग में रेखांकित किया गया था) के साथ परेशानी हो रही थी; रिश्तेदार आयात में बदल गया ( from . import user) और लिंटर ने अब इसे चिह्नित नहीं किया।
rbatt

9

इसे समझने के लिए और अधिक सरल बनाने के लिए:

चरण 1: एक निर्देशिका में जाने देता है, जहां सभी को शामिल किया जाएगा

$ cd /var/tmp

चरण 2: अब एक class1.py फ़ाइल बनाते हैं जिसका वर्ग नाम Class1 है जिसमें कुछ कोड है

$ cat > class1.py <<\EOF
class Class1:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF

चरण 3: अब एक class2.py फ़ाइल बनाते हैं जिसका वर्ग नाम Class2 है जिसमें कुछ कोड है

$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF

चरण 4: अब एक main.py जो 2 और विभिन्न फ़ाइलों से Class1 और Class2 का उपयोग करने के लिए एक बार निष्पादित किया जाएगा बनाने देता है

$ cat > main.py <<\EOF
"""this is how we are actually calling class1.py and  from that file loading Class1"""
from class1 import Class1 
"""this is how we are actually calling class2.py and  from that file loading Class2"""
from class2 import Class2

print Class1.OK
print Class2.OK
EOF

चरण 5: प्रोग्राम को चलाएं

$ python main.py

आउटपुट होगा

[Class1 OK]: 
[Class2 OK]:

4
और अगर यह काम नहीं करता है और main.py क्लास 1 या क्लास 2 नहीं पढ़ सकता है? ... हम क्या याद कर रहे हैं?
डार्कजैग

6

अजगर ३


वही directory

फ़ाइल आयात करें:log.py

आयात वर्ग SampleApp():।

import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

या

निर्देशिका है basic

फ़ाइल में आयात log.py:।

आयात वर्ग SampleApp():।

from basic import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

5
from user import User 
from dir import Dir 

इसने पायथन 2.7 और पायथन 3.6 दोनों के लिए init .py फ़ाइल के बिना मेरे लिए काम किया ।
imsrgadich

1
@imsrgadich यह तब तक काम करता है जब तक आप निर्देशिका में पायथन चला रहे होते हैं जिसमें फाइलें होती हैं। यह एक अपवाद है। इस टिप्पणी को
सिप्रियन टॉमोयाग

5

अगर user.py और dir.py कक्षाओं में शामिल नहीं हैं तो

from .user import User
from .dir import Dir

काम नहीं कर रहा। फिर आपको आयात करना चाहिए

from . import user
from . import dir

0

मुझे यकीन नहीं है कि यह काम क्यों है लेकिन Pycharm बिल्ड का उपयोग कर रहा है from file_in_same_dir import class_name

आईडीई ने इसके बारे में शिकायत की थी लेकिन ऐसा लगता है कि यह अभी भी काम कर रहा है। मैं पायथन 3.7 का उपयोग कर रहा हूं


-2

बस बहुत संक्षिप्त है, एक फ़ाइल बनाएँ __init__.pyवर्ग निर्देशिका है और फिर इसे अपनी स्क्रिप्ट में आयात करें जैसे कि निम्नलिखित (सभी मामले आयात करें)

from classes.myscript import *

केवल चयनित कक्षाएं आयात करें

from classes.myscript import User
from classes.myscript import Dir

4
इस उत्तर में देखे गए वाइल्डकार्ड आयात को आमतौर पर पीईपी 8 में वर्णित के रूप में खराब शैली माना जाता है ।
V02460

-3

उसी निर्देशिका से आयात करने के लिए

from . import the_file_you_want_to_import 

उप निर्देशिका से आयात करने के लिए निर्देशिका होनी चाहिए

init .py

आप के अलावा अन्य फाइल फाइल

निर्देशिका से आपका_फाइल आयात करें


3
मुझे नहीं लगता कि यह उत्तर कुछ भी जोड़ता है जो अन्य उत्तर नहीं थे, और अन्य उत्तरों का एक व्यापक सारांश भी नहीं है। तो मुझे आश्चर्य है कि आपने इसे क्यों लिखा है
lucidbrot

-3

python3

उपयोग

from .user import User inside dir.py file

तथा

use from class.dir import Dir inside main.py
or from class.usr import User inside main.py

इस तरह


3
यह उत्तर वास्तव में पहले से ही किए गए अन्य उत्तर से अधिक कुछ नहीं जोड़ता है, और इसका कोई स्पष्टीकरण नहीं है। क्या कोई तरीका है जिससे आप अपने उत्तर को जोड़ने या सुधारने के लिए संपादित कर सकते हैं ? क्योंकि अन्यथा, यह जवाब देने के लिए खड़ा होता है जैसे कि यह उत्तर पूरी तरह से हटा दिया गया था
दास_गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.