2010-03-29 11 views
7

मेरे पास पाइथन लॉगिंग मॉड्यूल का उपयोग करके एक पायथन लॉगर सेट अप है। मैं कॉन्फ़िगरर मॉड्यूल का उपयोग कर कॉन्फ़िगरेशन फ़ाइल में लॉगिंग फॉर्मेटर ऑब्जेक्ट के साथ उपयोग कर रहा स्ट्रिंग को संग्रहीत करना चाहता हूं।क्या अस्थायी रूप से पाइथन की स्ट्रिंग इंटरपोलेशन को अक्षम करना संभव है?

स्वरूप स्ट्रिंग को एक अलग फ़ाइल में सेटिंग्स के शब्दकोश में संग्रहीत किया जाता है जो कॉन्फ़िगरेशन फ़ाइल के पढ़ने और लिखने को संभालता है। मेरी समस्या यह है कि अजगर अभी भी फ़ाइल को प्रारूपित करने का प्रयास करता है और जब यह सभी लॉगिंग-मॉड्यूल-विशिष्ट स्वरूपण झंडे को पढ़ता है तो गिर जाता है।

{ 
    "log_level":logging.debug, 
    "log_name":"C:\\Temp\\logfile.log", 
    "format_string": 
     "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s" 
} 

मेरा प्रश्न सरल है: मैं इसे कहीं और रखते हुए स्वरूपण कार्यक्षमता को कैसे अक्षम कर सकता हूं। मेरी शुरुआती प्रतिक्रिया विभिन्न प्रतिशत प्रतीकों से बचने के लिए बैकस्लैश का अत्यधिक उपयोग था, लेकिन निश्चित रूप से स्वरूपण को स्थायी रूप से तोड़ देता है जैसे कि जब भी मुझे इसकी आवश्यकता होती है तब भी यह काम नहीं करेगा।

मुझे यह भी उल्लेख करना चाहिए, क्योंकि यह टिप्पणियों में खरीदा गया था, कि कॉन्फ़िगर पार्सर कुछ आंतरिक इंटरपोलेशन करता है जो यात्रा का कारण बनता है। यहां मेरा ट्रेसबैक है:

Traceback (most recent call last): 
    File "initialconfig.py", line 52, in <module> 
    "%(asctime)s %(levelname)s: %(module)s, line %(lineno)d - %(message)s" 
    File "initialconfig.py", line 31, in add_settings 
    self.set(section_name, setting_name, default_value) 
    File "C:\Python26\lib\ConfigParser.py", line 668, in set 
    "position %d" % (value, m.start())) 
ValueError: invalid interpolation syntax in '%(asctime)s %(levelname)s: %(module 
)s, line %(lineno)d - %(message)s' at position 10 

साथ ही, अच्छी सेटिंग्स-फ़ाइल प्रथाओं पर सामान्य पॉइंटर्स अच्छा होगा। यह पहली बार है जब मैंने ConfigParser (या उस मामले के लिए लॉगिंग) के साथ कुछ भी महत्वपूर्ण किया है।

अग्रिम धन्यवाद, डोमिनिक

+0

प्रक्षेप (मैं अजगर 3.6.0 उपयोग कर रहा हूँ)? मुझे लगता है कि सही शब्द स्वरूपित होगा –

+0

@ एडिसन: नहीं, पायथन में इसे इंटरपोलेशन भी कहा जाता है। http://docs.python.org/library/stdtypes.html#string-formatting-operations –

+0

मैं उलझन में हूं - स्वरूपण केवल तभी होता है जब आप स्पष्ट रूप से इसे '%' [या 'string.substitute () ']। –

उत्तर

10

आप %% साथ percents भागने की कोशिश की थी?

+3

यह पता चला कि यह पायथन 2.6.2 में एक बग था। 2.6.5 तक अपग्रेड करने से समस्या ठीक हुई। यह वही करता है जो आवश्यक है। – dangerouslyfacetious

1

उपरोक्त कोड के साथ समस्या क्या है? इंटरपोलेशन केवल तब किया जाता है जब % ऑपरेटर स्ट्रिंग पर लागू होता है। यदि आप % का उपयोग नहीं करते हैं तो आप किसी भी अन्य स्ट्रिंग की तरह स्वरूपण स्ट्रिंग का उपयोग कर सकते हैं।

+0

मुझे उल्लेख करना चाहिए था - कॉन्फ़िगरर्स मॉड्यूल आंतरिक रूप से कुछ स्ट्रिंग इंटरपोलेशन करता है और यह वह जगह है जहां यह यात्रा करता है। मैं स्पष्टता के लिए ट्रेसबैक के साथ अपना प्रश्न संपादित करूंगा। – dangerouslyfacetious

9

आप ConfigParser.ConfigParser के बजाय ConfigParser.RawConfigParser का उपयोग करना चाह सकते हैं। केवल उत्तरार्द्ध कॉन्फ़िगरेशन मानों पर जादुई इंटरपोलेशन करता है।

संपादित करें:

वास्तव में, ConfigParser.SafeConfigParser का उपयोग कर आप करेंगे एक अतिरिक्त % प्रतिशत चिह्न के साथ प्रारूप तार पलायन करने में सक्षम। यह उदाहरण तो काम करना चाहिए:

{ 
    "log_level":logging.debug, 
    "log_name":"C:\\Temp\\logfile.log", 
    "format_string": 
     "%%(asctime)s %%(levelname)s: %%(module)s, line %%(lineno)d - %%(message)s" 
} 
+0

यह काम किया। हालांकि जब मुझे इंटरपोलेशन सुविधाओं का उपयोग करने की आवश्यकता होती है तो क्या होता है? – dangerouslyfacetious

+0

उत्तर का मेरा अद्यतन हिस्सा देखें। – Haes

5

वहाँ RawConfigParser जो प्रक्षेप व्यवहार के बिना ConfigParser की तरह है। यदि आप कॉन्फ़िगरेशन फ़ाइल के किसी भी अन्य भाग में इंटरपोलेशन सुविधा का उपयोग नहीं करते हैं, तो आप अपने कोड में ConfigParserRawConfigParser के साथ बस प्रतिस्थापित कर सकते हैं।

अधिक जानकारी के लिए RawConfigParser के दस्तावेज़ देखें।

1

पाइथन का कौन सा संस्करण आप उपयोग कर रहे हैं? 2.6.4 करने के लिए एक उन्नयन में मदद कर सकते हैं, को देखने के

http://bugs.python.org/issue5741

+0

यह तय है, धन्यवाद। – dangerouslyfacetious

2

तुम भी प्रक्षेप None करने के लिए सेट कर सकते हैं।

config = ConfigParser(strict=False, interpolation=None) 

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