2010-02-02 8 views
15

में एक मॉड्यूल का आयात यह एक अजगर नौसिखिया सवाल यह है:नेस्टेड संकुल

मैं निम्नलिखित निर्देशिका संरचना है:

test 
-- test_file.py 
a 
-- b 
    -- module.py  

जहां test, a और b फ़ोल्डर हैं। test और a दोनों एक ही स्तर पर हैं।

module.py में shape नामक एक कक्षा है, और मैं test_file.py में इसका एक उदाहरण तुरंत चालू करना चाहता हूं। ऐसा मैं किस प्रकार करूं?

मैं कोशिश की है:

from a.b import module 

लेकिन मुझे मिल गया:

ImportError: No module named a.b 
+0

http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python देखें। –

उत्तर

13

तुम क्या चाहते की तरह एक रिश्तेदार आयात है। जैसा कि कहा गया here:

Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application should always use absolute imports.

इसलिए, यदि आप test_file.py आपका मुख्य मॉड्यूल के रूप में कॉल करना चाहते हैं, तो आप अपने मॉड्यूल की संरचना बदल रहा है और एक पूर्ण आयात का उपयोग, बस ऊपर से रिश्तेदार आयात का उपयोग पर विचार करना चाहिए और कुछ।

+0

+1। मैंने नहीं देखा कि वह कहां से आयात करने की कोशिश कर रहा था। –

+1

नीचे (अज्ञात मेरे लिए) नीचे मतदाता: जब आप एक उत्तर को कम वोट देते हैं तो आपको यह बताते हुए एक टिप्पणी छोड़नी चाहिए कि इसमें क्या गलत है, ताकि जो भी इसे पढ़ता है (और लेखक) को त्रुटि के बारे में सूचित किया जा सके ... – 3lectrologos

+0

मुझे ValueError मिल रहा है: गैर-पैकेज – khelll

7

पहले ऐसा करने के लिए बात जल्दी से the official docs on this ब्राउज़ करने के लिए किया जाएगा।

निर्देशिका को एक पैकेज बनाने के लिए, आपको __init__.py फ़ाइल जोड़नी होगी। इसका मतलब है कि आपके पास a और b निर्देशिकाओं में ऐसी फ़ाइल होगी। तो फिर तुम सीधे एक

import a.b.module 

कर सकते हैं लेकिन आप a.b.module जो कठिन है के रूप में यह उल्लेख करने के लिए, ताकि आप तो

import a.b.module as mod #shorter name 

की तरह आयात की as फार्म का उपयोग करें और यह उल्लेख कर सकते हैं होगा mod के रूप में।

फिर आप mod.shape() जैसे नियमित सम्मेलनों का उपयोग करके mod के अंदर चीजों को तुरंत चालू कर सकते हैं।

कुछ अन्य सूक्ष्मताएं हैं। विवरण के लिए कृपया दस्तावेज़ों के माध्यम से जाएं।

from ..a.b import module

इस के साथ समस्या यह है कि अगर आप अपने मुख्य मॉड्यूल के रूप में test_file.py बुला रहे हैं काम नहीं करता है:

+0

मैंने मॉड्यूल के रूप में आयात किया है और सभी संकुलों के लिए __init__.py जोड़ा है लेकिन मुझे आयात त्रुटि मिल रही है: कोई मॉड्यूल abmodule – khelll

+0

@khell नामक नहीं है, आपको रूट से कमांड को पाइथन परीक्षण/test_file.py – systempuntoout

+1

जैसे कमांड को चलाया जाना चाहिए। यह '__init__ है। py'। 'Init.py' नहीं। विवरण के लिए उत्तर में लिंक देखें। –

9
  1. निर्देशिका a एक पैकेज होने की आवश्यकता है। इसे एक पैकेज बनाने के लिए __init__.py फ़ाइल जोड़ें, जो एक साधारण निर्देशिका होने से एक कदम है।

  2. निर्देशिका b को a का उप-समूह होने की भी आवश्यकता है। __init__.py फ़ाइल जोड़ें।

  3. निर्देशिका test शायद एक पैकेज भी होना चाहिए। यह कहना मुश्किल है कि यह आवश्यक है या नहीं। पाइथन मॉड्यूल की प्रत्येक निर्देशिका औपचारिक पैकेज होने के लिए आमतौर पर यह एक अच्छा विचार है।

  4. import के लिए, पैकेज sys.path पर होना चाहिए; यह PYTHONPATH पर्यावरण परिवर्तक से बनाया गया है। डिफ़ॉल्ट रूप से स्थापित साइट-पैकेज और वर्तमान कार्यशील निर्देशिका (प्रभावी रूप से) केवल दो स्थान हैं जहां एक पैकेज पाया जा सकता है।

    इसका मतलब है कि a या तो स्थापित होना चाहिए, या, आपकी वर्तमान कार्यशील निर्देशिका को a से ऊपर एक स्तर पैकेज होना चाहिए।

    या, आपको a शामिल करने के लिए अपने PYTHONPATH पर्यावरण चर सेट करने की आवश्यकता है।

sys.path कैसे बनाया गया है पर पूरी जानकारी के लिए

http://docs.python.org/tutorial/modules.html#the-module-search-path

http://docs.python.org/using/cmdline.html#envvar-PYTHONPATH

इसके अलावा, http://docs.python.org/library/site.html

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

  • कोई संबंधित समस्या नहीं^_^