2010-06-18 14 views
8

भीतर config फ़ाइलों तक पहुँचने मैं एक अजगर परियोजना निम्नलिखित संरचना है कि है। (जब मैं एक ज़िप प्रोग्राम का उपयोग करके इसकी जांच करता हूं तो संरचना समान दिखती है।) मजाकिया बात यह है कि, जब मैं अपने आईडीई से पायथन कोड चलाता हूं तो यह ठीक काम करता है और कॉन्फ़िगरेशन फ़ाइलों तक पहुंच सकता है; लेकिन जब मैं अंडे का उपयोग करके इसे एक अलग पायथन लिपि से चलाने की कोशिश करता हूं, तो यह अंडे में कॉन्फ़िगरेशन फ़ाइलों को नहीं ढूंढ सकता है। यदि मैं कॉन्फ़िगरेशन फ़ाइलों को कॉलिंग पाइथन स्क्रिप्ट (अंडे के बाहर) के सापेक्ष निर्देशिका में डालता है, तो यह काम करता है - लेकिन उस तरह की एक आत्मनिर्भर अंडे रखने के उद्देश्य को हरा देती है जिसमें प्रोग्राम की सभी कार्यक्षमता होती है और कहीं से भी कहा जा सकता है। मैं किसी भी वर्ग/मॉड्यूल का उपयोग कर सकता हूं और अंडे से किसी भी कार्य को तब तक चला सकता हूं जब तक कि वे कॉन्फ़िगरेशन फ़ाइलों का उपयोग न करें ... लेकिन यदि वे करते हैं, तो अंडे उन्हें नहीं ढूंढ सकता है और इसलिए कार्य काम नहीं करते हैं।समस्या एक अजगर अंडे

किसी भी मदद की वास्तव में सराहना की जाएगी! हम यहाँ अंडा चीज के लिए नए हैं और वास्तव में नहीं जानते कि कहां से शुरू करना है।

उत्तर

11

समस्या यह है कि कॉन्फ़िगरेशन फ़ाइलें अब फ़ाइलें नहीं हैं - वे अंडे के भीतर पैक की जाती हैं। दस्तावेज़ों में जवाब ढूंढना आसान नहीं है, लेकिन यह वहां है। से setuptools developer's guide:

Typically, existing programs manipulate a package's __file__ attribute in order to find the location of data files. However, this manipulation isn't compatible with PEP 302-based import hooks, including importing from zip files and Python Eggs.

उन तक पहुँचने के लिए, आपको संसाधन प्रबंधन API के लिए instructions का पालन करने की जरूरत है।

मेरे अपने कोड में, मुझे लॉगिंग कॉन्फ़िगरेशन फ़ाइल के साथ यह समस्या थी। मैंने एपीआई को सफलतापूर्वक इस तरह इस्तेमाल किया:

from pkg_resources import resource_stream 

_log_config_file = 'logging.conf' 
_log_config_location = resource_stream(__name__, _log_config_file) 
logging.config.fileConfig(_log_config_location) 
_log = logging.getLogger('package.module') 
+0

मैं उलझन में हूं ... मैं थोड़ा धीमा हो सकता हूं क्योंकि ये अवधारणाएं मेरे लिए नई हैं इसलिए कृपया मेरे साथ भालू। मुझे अपने पायथन क्लास में कोड बदलना है जो हार्डकोडिंग के बजाय pkg_resources मॉड्यूल का उपयोग करने के लिए कॉन्फ़िगरेशन फ़ाइल का उपयोग करता है? कॉन्फ़िगरेशन फ़ाइल को लोड करने के लिए अब मेरे पास लाइनें हैं config = ConfigParser.RawConfigParser() config.read (".. \\ config \\" + पर्यावरण + "_settings.ini") '... मुझे इसे क्या बदलना चाहिए सेवा मेरे? – froadie

+0

@froadie: यह सही है। आपको 'config.read (resource_stream (__ name__, ".. \\ config \\" + पर्यावरण + "_settings.ini" जैसी कुछ चाहिए।) इसके अलावा, आपको संसाधन प्रबंधन मॉड्यूल आयात करने की आवश्यकता है:' pkg_resources आयात संसाधन_स्ट्रीम 'से –

+0

मैंने कुछ इसी तरह की कोशिश की - 'config.read (pkg_resources.resource_filename (__ name__," .. \\ config \\ "+ पर्यावरण +" _settings.ini "))' संसाधन संसाधन के बजाय resource_filename क्योंकि फ़ाइल नाम लेता है) - और जब मैं इसे चलाता हूं तो यह काम करता है लेकिन मुझे अंडे से कॉल करने का प्रयास करते समय भी एक त्रुटि मिलती है, हालांकि इस बार एक नया - 'KeyError:' myPackageName \\ .. \\ config \\ dev_settings.ini'' – froadie

2

Setuptools' discussion of accessing pacakged data files at runtime देखें। यदि आप स्क्रिप्ट को अंडे के अंदर काम करना चाहते हैं तो आपको अपनी कॉन्फ़िगरेशन फ़ाइल a different way पर जाना होगा। इसके अलावा, इसके लिए काम करने के लिए, आपको अपनी कॉन्फ़िगरेशन निर्देशिका को एक खाली __init__.py फ़ाइल में फेंककर एक पायथन पैकेज बनाने की आवश्यकता हो सकती है।

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