2011-11-04 9 views
7

मैंने जितने सारे एसओ पेज देखे हैं और मैंने जो कुछ भी पाया, उसकी कोशिश की है, लेकिन कोई भी सफल नहीं हुआ है। मैंने आयात करने और हर उदाहरण की कोशिश करने के बारे में पीईपी पेज की भी जांच की, जिसमें से कोई भी काम नहीं करता था।वर्तमान फ़ोल्डर के बगल में एक फ़ोल्डर से मॉड्यूल कैसे आयात करें?

मेरे पास यूनिट परीक्षणों के साथ एक परीक्षण फ़ोल्डर है, और मुझे उस मॉड्यूल को आयात करने की आवश्यकता है जिसे मैं परीक्षण करना चाहता हूं। मॉड्यूल 'src' नामक फ़ोल्डर में हैं जो src फ़ोल्डर के बगल में है।

Project/
     src/
      stringbuilder.py 
      __init__.py 
     tests/
      stringbuilder_test.py 
      __init__.py 
     main.py 
     __init__.py 

मैं सब कुछ मैं कर सकता की कोशिश की है: यह परियोजना के मुख्य फ़ोल्डर सहित एक मॉड्यूल बनाने हर फ़ोल्डर में __init__.py जोड़ने

फ़ोल्डरों/फ़ाइलें कुछ इस तरह दिखाई।

import src.module_to_test 
from ..src.module_to_test import function_to_test 
from ..src import module_to_test 

मैंने अन्य सभी संयोजनों का परीक्षण किया है जिनमें से सभी असफल रहे हैं। मुझे लगता है कि मेरी सेटिंग्स या समझ के साथ कुछ गलत होना चाहिए - मैंने सोचा कि यह सरल होना प्रतीत होता है।

यदि मैं कोई स्पष्ट त्रुटियां कर रहा हूं तो कृपया मुझे बताएं।

from tests import stringbuilder 

त्रुटि संदेश:

$ ./stringbuilder_test.py 
Traceback (most recent call last): 
    File "./stringbuilder_test.py", line 14, in <module> 
    from tests import stringbuilder 
ImportError: No module named tests 

एक ही त्रुटि के लिए होता है (लेकिन परीक्षण = src):

from src import stringbuilder 
+0

"src" या "test"? क्या आप हमें अपनी फाइलों और फ़ोल्डर्स पदानुक्रम के बारे में अधिक जानकारी दे सकते हैं? – Nicolas

+0

एक पदानुक्रम दिखाने की कोशिश करने के लिए पोस्ट में थोड़ा जोड़ा गया। –

+0

'परीक्षण आयात स्ट्रिंगबिल्डर' से - आपको बस पेड़ संरचना को देखने के लिए ऊपर देखना होगा कि यह –

उत्तर

3

यदि स्क्रिप्ट को किसी पैकेज के अंदर से निष्पादित किया जाता है, तो आयात को ठीक से काम करने के लिए विभिन्न हैक्स को नियोजित करने की आवश्यकता होती है। शायद इनमें से सबसे आम sys.path हेरफेर करने के लिए है:

import sys, os 

sys.path.insert(0, 
    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

from src import stringbuilder 

del sys.path[0] 

वहाँ सामान्य आयात बयानों का उपयोग कर इस लक्ष्य को हासिल करने के लिए कोई रास्ता नहीं है।

आम तौर पर बेहतर समाधान यह है कि पैकेजों के अंदर पूरी तरह से स्क्रिप्ट चलाने से बचें। इसके बजाय, के बाहर सभी निर्देशिकाओं को एक निर्देशिका में पैकेज डालें। यह देखते हुए कि वर्तमान में चल रही स्क्रिप्ट की निर्देशिका स्वचालित रूप से sys.path की शुरुआत में जोड़ दी गई है, यह गारंटी देगा कि पैकेज को हमेशा आयात किया जा सकता है, चाहे स्क्रिप्ट को निष्पादित किया गया हो।

तो निर्देशिका संरचना कुछ इस तरह दिख सकता है:

project/
    package/
     __init__.py 
     src/
      __init__.py 
      stringbuilder.py 
     tests/
      __init__.py 
      stringbuilder_test.py 
    main.py 
    test.py 

test.py स्क्रिप्ट तो इस तरह अपने परीक्षण आयात कर सकते हैं:

from package.tests import stringbuilder_test 

और stringbuilder_test.py इस तरह src मॉड्यूल आयात कर सकते हैं:

from package.src import stringbuilder 
-3

अपने PATH करने के लिए कि फ़ोल्डर जोड़ें।

+2

ओच! क्या एक डरावना विचार है। –

+0

इसे PYTHONPATH में जोड़ना थोड़ा कम डरावना है लेकिन सवाल के बिंदु को याद करता है। पीएटीएच में जोड़ने से थोड़ी सी मदद नहीं होगी। – geoffspear

0
from folder import my_module 

अगर वहाँ folder में एक __init__.py फ़ाइल है।

+0

यह असफल रहा, यह कहा गया कि फ़ोल्डर नामक कोई मॉड्यूल नहीं है। –

+0

एर, मुझे लगता है कि आप अपने फ़ोल्डर के नाम से 'फ़ोल्डर' को प्रतिस्थापित करने के लिए थे! –

+0

मैंने कोशिश की, एक ही त्रुटि। :( –

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