पायथन में सेटिंग्स फ़ाइल का उपयोग करके सबसे अच्छा अभ्यास क्या है? [बन्द है]


332

मेरे पास एक कमांड लाइन स्क्रिप्ट है जिसे मैं बहुत सारे तर्कों के साथ चलाता हूं। मैं अब एक ऐसे बिंदु पर आ गया हूं, जहां मेरे बहुत से तर्क हैं, और मैं चाहता हूं कि शब्दकोश के रूप में भी कुछ तर्क हों।

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

कुछ 'मांग':

  • उपयोग करने के बजाय pickleमैं यह चाहूंगा कि यह एक सीधा फॉरवर्ड टेक्स्ट फाइल हो, जिसे आसानी से पढ़ा और संपादित किया जा सके।
  • मैं इसमें शब्दकोश-जैसा डेटा जोड़ने में सक्षम होना चाहता हूं, अर्थात, किसी प्रकार के घोंसले के शिकार का समर्थन किया जाना चाहिए।

एक सरल छद्म उदाहरण फ़ाइल:

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2

6
इस उदाहरण फ़ाइल का विशेष सिंटैक्स वास्तव में YAML है, बेन्सन के उत्तर की जांच करें।
स्किप्पी ले ग्रांड गौरौ

जवाबों:


231

आपके पास एक नियमित पायथन मॉड्यूल हो सकता है, जैसे कि config.py, कहो:

truck = dict(
    color = 'blue',
    brand = 'ford',
)
city = 'new york'
cabriolet = dict(
    color = 'black',
    engine = dict(
        cylinders = 8,
        placement = 'mid',
    ),
    doors = 2,
)

और इसे इस तरह उपयोग करें:

import config
print config.truck['color']  

69
यह एक बहुत बुरा विचार है जैसे कि आप कम-विशेषाधिकार प्राप्त उपयोगकर्ताओं को केवल कॉन्फ़िगरेशन फ़ाइलों को बदलने में सक्षम होना चाहते हैं, इस तरह आप अनिवार्य रूप से उन्हें विशेषाधिकार प्राप्त कोड में चुपके करने की अनुमति दे रहे हैं।
निकोले

171
"कम-विशेषाधिकार प्राप्त" उपयोगकर्ताओं को अधिक विशेषाधिकार प्राप्त कार्यक्रम के लिए कॉन्फ़िगर करने की अनुमति देना संभवत: वैसे भी एक संदिग्ध सेटअप है।
XTL

18
तुम भी py2app जैसे उपकरण का उपयोग कर परिनियोजन के लिए अपनी परियोजना पैकेजिंग मुद्दों में चला सकते हैं। यह एप्लिकेशन के हस्ताक्षर को अमान्य करने के बाद उपयोगकर्ता इसे वितरित करने के बाद कॉन्फ़िगरेशन फ़ाइल को संपादित करने में सक्षम नहीं हो सकता है।
bschwagg

18
इसके साथ मुख्य नुकसान (अन्यथा बहुत सुविधाजनक विकल्प) यह है कि .pyफाइलें निष्पादन योग्य हैं, इसलिए कॉन्फ़िगरेशन को लोड करने का प्रयास करते समय किसी भी प्रकार का कोड चलाया जा सकता है import। यह सुरक्षा के दृष्टिकोण से अस्वीकार्य है।
अपाला

5
इसका एक संस्करण सुरक्षित रूप से नहीं किया जा सकता है ast.literal_eval? docs.python.org/3/library/ast.html#ast.literal_eval
एंड्रे सी। एंडरसन

169

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

यम मॉड्यूल का उपयोग करना अत्यंत सरल है:

import yaml
config = yaml.safe_load(open("path/to/config.yml"))

3
yaml हमेशा कुछ ऐसा होता है जिसे मैं बदल देता हूं; प्रारूप मृत सरल से लेकर एम्बेडेड अजगर कोड का समर्थन करने के लिए हो सकता है, और मानक पुस्तकालय आपके लिए पार्सिंग और स्वच्छता के भारी उठाने का काम करता है।
टोडर मिनाकोव

15
माना। आपके लिए या YAML लिखने वाले उपयोगकर्ताओं के लिए, यहां सबसे अच्छा YAML संदर्भ है जो मुझे पता हैआधिकारिक दस्तावेज दुर्भाग्य से एक कल्पना इसको लागू करने के उद्देश्य से, और कुछ भी बाकी है, लेकिन Eevee गाइड बढ़िया है।
एस्टीस

5
हमारे लिए बिना इजाजत, कि pip3 install pyyamlयह अजगर लिपियों में आयात करने के लिए तैयार हो जाओ।
user8675309

2
खबरदार, यम केवल अनुकूल है यदि आप इसे बहुत सरल रखते हैं, तो यह डिफ़ॉल्ट रूप से समस्याग्रस्त टन है, असुरक्षित सुविधाओं पर सीमाबद्ध है। सुरक्षित-बाय-डिफ़ॉल्ट लाइट विकल्प के बजाय hitchdev.com/strictyaml आज़माएं ।
ग्रिंगो सुवे

106

मुझे यह https://wiki.python.org/moin/ConfigParserExamains का उपयोग करने के लिए सबसे उपयोगी और आसान लगा

आप बस एक "myfile.ini" बनाएँ:

[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30
Single: True

[SectionTwo]
FavoriteColor=Green
[SectionThree]
FamilyName: Johnson

[Others]
Route: 66

और डेटा को पुनः प्राप्त करें जैसे:

>>> import ConfigParser
>>> Config = ConfigParser.ConfigParser()
>>> Config
<ConfigParser.ConfigParser instance at 0x00BA9B20>
>>> Config.read("myfile.ini")
['c:\\tomorrow.ini']
>>> Config.sections()
['Others', 'SectionThree', 'SectionOne', 'SectionTwo']
>>> Config.options('SectionOne')
['Status', 'Name', 'Value', 'Age', 'Single']
>>> Config.get('SectionOne', 'Status')
'Single'

20
अजगर 3 के लिए (सभी लोअरकेस) के बजाय कॉन्फिगरेशन मॉड्यूल का उपयोग करें
रोलैंड

2
समाधान लागू करने के लिए यह सबसे तेज़, स्पष्ट और सबसे आसान है, क्योंकि कोई कार्यान्वयन नहीं है, बस उपयोग है। :) धन्यवाद!
अलेक्जेंडार

क्या यह समर्थन नेस्टेड शब्दकोशों के रूप में प्रश्न में पूछा जाएगा?
जैकब ब्लाहा

54

यमल और जसन सेटिंग्स / कॉन्फिगरेशन को स्टोर करने के लिए सबसे सरल और सबसे अधिक इस्तेमाल किया जाने वाला फाइल फॉर्मेट हैं। PyYaml का उपयोग yaml को पार्स करने के लिए किया जा सकता है। जसन 2.5 से पहले से ही अजगर का हिस्सा है। यमल जसन का सुपरसेट है। Json मल्टी लाइन स्ट्रिंग्स को छोड़कर अधिकांश उपयोग के मामलों को हल करेगा जहां से बचना आवश्यक है। यमल इन मामलों का भी ध्यान रखता है।

>>> import json
>>> config = {'handler' : 'adminhandler.py', 'timeoutsec' : 5 }
>>> json.dump(config, open('/tmp/config.json', 'w'))
>>> json.load(open('/tmp/config.json'))   
{u'handler': u'adminhandler.py', u'timeoutsec': 5}

13
जबकि कम या ज्यादा समतुल्य, json लगभग उतना ही पठनीय नहीं है जितना कि yaml। चूँकि उनका नमूना विन्यास वास्तव में वैध है, मैं तनाव में हूँ, बजाय इसके कि जोंस।
बेन्सन

23
"Json.dump (config, fp, Sort_keys = True, indent = 4)" का उपयोग करके पठनीयता में सुधार होता है।
फोबी जूल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.