मुख्य प्रश्न यह है: क्या आप चाहते हैं कि आपकी कॉन्फ़िगरेशन फ़ाइल कुछ ट्यूरिंग पूर्ण भाषा (जैसे पायथन है) में हो? यदि आप ऐसा चाहते हैं, तो आप कुछ अन्य (ट्यूरिंग कम्प्लीट) स्क्रिप्टिंग लैंग्वेज जैसे कि गुइल या लुआ को एम्बेड करने पर भी विचार कर सकते हैं (क्योंकि वहाँ का अर्थ "सरल" के रूप में माना जा सकता है, या पायथन की तुलना में एम्बेड करना है, एक्सटेंडिंग & amp ; अध्याय पढ़ें पाइथन एंबेडिंग )। मैं उस पर आगे चर्चा नहीं करूँगा (क्योंकि अन्य उत्तर-अमोन द्वारा - चर्चा की गई है कि गहराई से) लेकिन ध्यान दें कि आपके आवेदन में एक स्क्रिप्टिंग भाषा एम्बेड करना एक प्रमुख वास्तुशिल्प विकल्प है , जिसे आपको बहुत जल्दी विचार करना चाहिए; मैं वास्तव में उस विकल्प को बाद में बनाने की सलाह नहीं देता!
एक कार्यक्रम का एक जाना-पहचाना उदाहरण "थ्रू स्क्रिप्ट्स" है, जो GNU एमएसीएस संपादक है (या मालिकाना क्षेत्र में शायद ऑटोकैड ); इसलिए ध्यान रखें कि यदि आप स्क्रिप्टिंग को स्वीकार करते हैं, तो कुछ उपयोगकर्ता अंततः-और शायद दुर्व्यवहार का उपयोग करेंगे, आपके दृष्टिकोण में- कि सुविधा बड़े पैमाने पर और एक बहु-हजार लाइनें स्क्रिप्ट बना सकती हैं; इसलिए एक अच्छी स्क्रिप्टिंग भाषा का चुनाव महत्वपूर्ण है।
हालाँकि (कम से कम POSIX सिस्टम पर), आप कॉन्फ़िगरेशन को "फ़ाइल" सक्षम करने के लिए सुविधाजनक मान सकते हैं , आरंभिक समय में गतिशील रूप से गणना की जा सकती है (ज़ाहिर है, आपके सिस्टम व्यवस्थापक या उपयोगकर्ता के लिए एक सामान्य कॉन्फ़िगरेशन का बोझ छोड़कर; वास्तव में यह एक कॉन्फ़िगरेशन है; पाठ जो कुछ फ़ाइल या कुछ कमांड से आता है)। उसके लिए, आप बस कन्वेंशन (और इसे दस्तावेज कर सकते हैं) को गोद ले सकते हैं, जैसे कि एक !
या एक |
से शुरू होने वाली कॉन्फ़िगरेशन फ़ाइल पथ वास्तव में एक शेल कमांड है जिसे आप पाइपलाइन के रूप में पढ़ेंगे । यह आपके उपयोगकर्ता को जो भी "पूर्वप्रक्रमक" या "स्क्रिप्टिंग भाषा" का उपयोग करने के विकल्प के साथ छोड़ देता है, वह सबसे परिचित है।
(यदि आप गतिशील रूप से गणना किए गए कॉन्फ़िगरेशन को स्वीकार करते हैं तो आपको सुरक्षा मुद्दों के बारे में अपने उपयोगकर्ता पर भरोसा करने की आवश्यकता है)
इसलिए आपके आरंभीकरण कोड में, आपकी main
इच्छा (उदाहरण के लिए) कुछ --config
तर्क को स्वीकार करती हैconfarg
और इससे कुछ FILE*configf;
प्राप्त करती है। यदि वह तर्क इसके साथ शुरू होता है !
(यानी यदि (confarg[0]=='!')
....), तो आप configf = popen(confarg+1, "r");
उस पाइप का उपयोग और बंद कर देंगे pclose(configf);
। अन्यथा आप configf=fopen(confarg, "r");
उस फ़ाइल का उपयोग और बंद कर देंगे fclose(configf);
(त्रुटि जाँच को न भूलें)। देखें पाइप (7) , popen (3) , fopen (3) । एक आवेदन के लिए पायथन में os.popen , आदि के बारे में पढ़ा ...
( ऊपर दिए गए ट्रिक को दरकिनार !foo.config
करने के ./!foo.config
लिए नामांकित कॉन्फ़िगरेशन फ़ाइल को पास करने के इच्छुक अजीब उपयोगकर्ता के लिए भी दस्तावेज़ popen
)
BTW, इस तरह की ट्रिक केवल एक सुविधा है (उन्नत फ़ाइल की आवश्यकता के लिए उन्नत उपयोगकर्ता से बचने के लिए कॉन्फ़िगरेशन फ़ाइल उत्पन्न करने के लिए कुछ शेल स्क्रिप्ट को कोड करना )। यदि उपयोगकर्ता किसी भी बग की रिपोर्ट करना चाहता है, तो उसे आपको उत्पन्न कॉन्फ़िगरेशन फ़ाइल भेजनी चाहिए ...
ध्यान दें कि आप अपने एप्लिकेशन को शुरुआती समय में प्लगइन्स का उपयोग करने और लोड करने की क्षमता के साथ डिजाइन कर सकते हैं , उदाहरण के लिए dlopen (3) के साथ (और आपको उस प्लगइन के बारे में अपने उपयोगकर्ता पर भरोसा करने की आवश्यकता है)। फिर, यह एक बहुत ही महत्वपूर्ण वास्तु निर्णय है (और आपको इन प्लगइन्स और आपके आवेदन के बारे में कुछ स्थिर एपीआई और सम्मेलन को परिभाषित करने और प्रदान करने की आवश्यकता है )।
पाइथन जैसी स्क्रिप्टिंग भाषा में कोड किए गए एप्लिकेशन के लिए आप कुछ प्रोग्राम तर्क को भी एक्वल या एक्जीक्यूशन या इसी तरह के प्राइमेटिव के लिए स्वीकार कर सकते हैं । फिर, सुरक्षा मुद्दे तब (उन्नत) उपयोगकर्ता की चिंता है ।
आपकी कॉन्फ़िगरेशन फ़ाइल के लिए पाठ प्रारूप के बारे में (यह जेनरेट किया गया है या नहीं), मेरा मानना है कि आपको ज्यादातर इसे अच्छी तरह से दस्तावेज करने की आवश्यकता है (और कुछ विशेष प्रारूप का विकल्प उतना महत्वपूर्ण नहीं है; हालांकि, मैं आपको उपयोगकर्ता को डालने में सक्षम होने की सलाह देता हूं; कुछ -स्कैप्ड- इसके अंदर टिप्पणियां)। आप JSON इस्तेमाल कर सकते हैं (अधिमानतः कुछ JSON पार्सर को स्वीकार करने और हमेशा की तरह के साथ टिप्पणी लंघन साथ //
EOL या जब तक /*
... */
...), या YAML, या XML, या INI या अपने खुद के बात। कॉन्फ़िगरेशन फ़ाइल पार्स करना बहुत आसान है (और आपको उस कार्य से संबंधित कई लाइब्रेरी मिलेंगी)।