2010-12-27 15 views
28

मेरे पास "क्लास" नामक एक पाइथन क्लास है और एक अन्य पायथन क्लास है जिसे क्लासए आयात करना है जो "क्लासबी" है। निर्देशिका संरचना इस प्रकार है:भाई निर्देशिका से आयात

MainDir 
../Dir 
..../DirA/ClassA 
..../DirB/ClassB 

मैं sys.path कैसे प्रयोग करेंगे तो ClassB ClassA का उपयोग कर सकते हैं?

+2

यह रिश्तेदार आयात कहा जाता है और काफी googleable सामग्री और इसलिए सवाल का एक सा है। – delnan

+0

http://stackoverflow.com/questions/279237/python-import-a- मॉड्यूल-from-a-folder – jgritty

उत्तर

16

आप वास्तव में पैकेज का इस्तेमाल किया जाना चाहिए। तब MainDir sys.path पर फ़ाइल सिस्टम में एक बिंदु पर रख दिया गया है (उदाहरण के लिए .../साइट-संकुल), तो आप ClassB में कह सकते हैं:

from MainDir.Dir.DirA import ClassA # which is actually a module 

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

+0

में विफल हो जाएंगे, मैंने sys.path में मेनडिर जोड़ा और आपके समाधान की कोशिश की, लेकिन यह कहता है कि मेनडिर नामक कोई मॉड्यूल नहीं है। Dir.DirA, और वहाँ __init __। pys हैं सभी निर्देशिकाओं में। – skylerl

+3

मेनडिर को न जोड़ें, इसकी मूल निर्देशिका जोड़ें। यदि आप मेनडियर जोड़ते हैं (यदि वह पैकेज रूट नहीं है, तो यह ठीक है), फिर इसके बजाय 'Dir.DirA आयात क्लास' से आयात करें। – Keith

21

आप (, वर्तमान मॉड्यूल लिंक से उदाहरण - A.B.C) relative import उपयोग कर सकते हैं:

from . import D     # Imports A.B.D 
from .. import E    # Imports A.E 
from ..F import G    # Imports A.F.G 
+5

क्या यह केवल तभी काम नहीं करता जब वे पैकेज में हों? – skylerl

+4

@Yakattak: हाँ, लेकिन वे किसी भी पैकेज में होना चाहिए;) – delnan

+0

यह सबसे अच्छा और सरल उत्तर –

44

'मूल निर्देशिका से अजगर आयात' प्रश्न के जवाब के रूप में शाब्दिक:

'mymodule' आयात करने के लिए अपने वर्तमान मॉड्यूल की पेरेंट निर्देशिका में है:

import os 
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
os.sys.path.insert(0,parentdir) 
import mymodule 

संपादित करें दुर्भाग्यवश, __file__ विशेषता हमेशा सेट नहीं होती है। एक अधिक सुरक्षित parentdir पाने के लिए जिस तरह से निरीक्षण मॉड्यूल के माध्यम से है:

import inspect 
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
parentdir = os.path.dirname(currentdir) 
+0

इससे मेरी मदद की। – odigity

+0

रेमी - शाब्दिक उत्तर के लिए धन्यवाद। एक पाइथन ऐप के लिए टेस्ट कोड लिखते समय मुझे यह उपयोगी लगता है। मैं एक उपनिर्देशिका में परीक्षण कोड रख सकता हूं, और मैं मौजूदा प्रोजेक्ट को संशोधित किए बिना परीक्षणों को स्थानांतरित करना शुरू कर सकता हूं। (दूसरे शब्दों में; मौजूदा कोड को एक मॉड्यूल में बदलने से पहले मॉड्यूल में कनवर्ट करना गलत काम होगा, काम करने के लिए बग पेश करने के जोखिम के प्रबंधन के परिप्रेक्ष्य से चीजों को करने का गलत क्रम होगा।) मॉड्यूल पथ को बदलने की आपकी पद्धति आसान है। –

+0

यह केवल एक चीज है जो सिर्फ काम करती है, धन्यवाद! –

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