2012-12-10 9 views
15

से ConfigParser का उपयोग कर रिश्तेदार कॉन्फ़िग फ़ाइल लोड नहीं कर सकता मैं निम्नलिखित निर्देशिका संरचना है:उप-निर्देशिका

my_program/ 
     foo.py 
     __init__.py # empty 
     conf/ 
      config.cfg 
      __init__.py 

foo.py में मैं इस:

import sys 
#sys.path.append('conf/') 
import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read('conf/config.cfg') 

conf/__init__.py में मैं

है
__all__ = ["config.cfg"] 

मुझे यह त्रुटि foo.py में मिलती है जिसे मैं पूरा पथ देकर ठीक कर सकता हूं लेकिन नहीं काम करने के लिए रिश्तेदार पथ जब मैं सिर्फ conf/config.cfg डाल लेकिन मैं चाहता हूँ:

ConfigParser.NoSectionError 

जो वास्तव में इसका मतलब है कि फ़ाइल लोड नहीं किया जा सकता है (इसलिए यह खंड नहीं पढ़ सकते हैं)।

मैंने sys.path.append('conf/')foo.py में टिप्पणी/अन-टिप्पणी करने की कोशिश की है लेकिन यह कुछ भी नहीं करता है।

कोई भी विचार? बहुत धन्यवाद।

+0

अगर उत्तर आपकी समस्या का समाधान करता है, तो इसे स्वीकार करने के रूप में चिह्नित करना उपयोगी होगा ... :) – EOL

उत्तर

21

पथ वर्तमान कार्यशील निर्देशिका, जो आमतौर पर निर्देशिका, जिनसे आप अपने कार्यक्रम चलाने (लेकिन वर्तमान निर्देशिका अपने कार्यक्रम [या एक मॉड्यूल] द्वारा बदला जा सकता है के सापेक्ष हैं और यह सामान्य नहीं में है आपकी प्रोग्राम फ़ाइल की निर्देशिका)।

import os 
config.read(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'conf', 'config.cfg')) 

स्पष्टीकरण::

एक समाधान स्वतः foo.py में __file__ चर के माध्यम से, अपनी फ़ाइल के लिए पथ की गणना कि अजगर दुभाषिया आपके लिए बनाई गई में होते हैं प्रत्येक कार्यक्रम की __file__ चर (मॉड्यूल) शामिल हैं अपने पथ (वर्तमान निर्देशिका के सापेक्ष जब यह लोड किया गया था, मुझे लगता है- मुझे पायथन दस्तावेज़ में कुछ भी निर्णायक नहीं मिला)। इसे एक पूर्ण पथ में परिवर्तित करना सामान्य मामले को बेहतर तरीके से संभालता है जहां मॉड्यूल config.read() से पहले वर्तमान कार्यशील निर्देशिका को बदलता है, और जहां __file__ एक सापेक्ष पथ है (उदाहरण के लिए होता है जब foo.py अपनी निर्देशिका से आयात किया जाता है)।

इस तरह, आयात वर्तमान कार्यशील निर्देशिका, और जहां भी आप अपना पैकेज डालते हैं, सही ढंग से काम करता है।

पीएस: साइड नोट: __all__ = ["config.cfg"] वह नहीं है जो आप चाहते हैं: यह पाइथन को बताता है कि जब आप from conf import * करते हैं तो आयात करने के लिए कौन से प्रतीक (चर, फ़ंक्शन) आयात करते हैं। इसे हटाया जाना चाहिए।

+0

धन्यवाद। एक ही समस्या है, हालांकि मुझे डर लग रहा: 'आयात os' ' आयात ConfigParser' 'config = ConfigParser.ConfigParser()' ' config.read (os.path.join (os.path.dirname (__FILE__) , 'conf', 'config.cfg')) ' पहले की तरह ही त्रुटि उठाता है। मैंने '__all__ = [" config.cfg "]' – ale

+0

हटा दिया है यदि मैं पथ मुद्रित करता हूं तो यह सही ढंग से कहता है '।/Conf/config.cfg' जो अजीब है! – ale

+0

क्या आप उत्तर के अद्यतन संस्करण के साथ प्रयास कर सकते हैं? यह संभावित रूप से रिश्तेदार के बजाय एक पूर्ण पथ का उपयोग करता है। – EOL

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