2012-05-17 12 views
7

मैं विंडोज के लिए पायथन में एक प्रोग्राम पर काम कर रहा हूं, और चर और उपयोगकर्ता वरीयताओं को सहेजना चाहता हूं ताकि प्रोग्राम को समाप्त करने और पुनरारंभ करने के बाद भी मैं उन्हें याद कर सकूं ।बाद में उपयोग के लिए पाइथन में चर/प्राथमिकताओं को संग्रहीत करने के लिए

क्या विंडोज मशीनों पर ऐसा करने का एक आदर्श तरीका है? _winreg और विंडोज रजिस्ट्री इस कार्य के लिए उपयुक्त होगी? या क्या मुझे अपने स्वयं के डेटाबेस बनाने की ज़रूरत है?

उत्तर

3

आप आमतौर पर इसे "होम" फ़ोल्डर में कॉन्फ़िगरेशन फ़ोल्डर में स्टोर करना चाहते हैं। * निक्स सिस्टम पर यह आसान है, विंडोज़ में अधिक कठिन है, क्योंकि आपको वास्तव में "एप्लिकेशन डेटा" निर्देशिका प्राप्त करने की आवश्यकता है। यह आमतौर पर मेरे लिए काम करता है:

if not os.path.isdir("{0}.{1}".format(homedir,projectname)): 
    os.mkdir("{0}.{1}".format(homedir,projectname)) 

तो फिर तुम उस फ़ोल्डर में एक कॉन्फ़िग फ़ाइल बनाने के लिए और अपने विकल्पों को लिख सकते हैं:

import os 
if os.name != "posix": 
    from win32com.shell import shellcon, shell 
    homedir = "{}\\".format(shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0)) 
else: 
    homedir = "{}/".format(os.path.expanduser("~")) 

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

+0

'os.path.expanduser' हर जगह काम नहीं करता है? अधिक कोड क्यों लिखें? –

+0

बस विस्तारक का उपयोग करने से आपको एप्लिकेशन डेटा फ़ोल्डर नहीं मिलेगा, जो कि आप WinXP या win7 पर निर्भर करते हैं। ऐसा करने से आपको अपने विंडोज ओएस पर ध्यान दिए बिना एप्लिकेशन डेटा निर्देशिका मिलती है। – Josiah

+1

विंडोज़ पर कई पायथन ऐप्स आपके घर फ़ोल्डर में डेटा डालते हैं, न कि ऐप डेटा के लिए इसकी उपनिर्देशिका में। मुझे यह आदर्श लगता है, क्योंकि व्यवहार विंडोज और लिनक्स पर समान है। (पायथन, टोर्टोइज एचजी, और अन्य पायथन ऐप्स की एक पूरी छत।) –

4

जब तक कि मैं कुछ याद नहीं कर रहा हूं, रेगेक्स के पास विंडोज रजिस्ट्री के साथ कुछ लेना देना नहीं है। बस किसी कॉन्फ़िगरेशन फ़ाइल को कहीं भी उपयोगकर्ता की होम निर्देशिका या जो भी हो। स्टोर करें, कम से कम यही मैं लिनक्स पर करूंगा। कहीं ~/.config/

+0

क्षमा करें, मेरा मतलब '_winreg' था। फिक्स्ड! – Parker

1

का उपयोग करना चाहिये आप वरीयताओं की बस कुंजी-मान जोड़ों संग्रहीत करना चाहते हैं, तो एक पाठ कॉन्फ़िग फ़ाइल में करते हैं। आप अजगर संरचनाओं स्टोर करने के लिए चाहते हैं, यह करने के pickle या shelve के साथ। यदि आपको हल्का, परेशानी मुक्त है, तो rdbms sqlite का उपयोग करें।

1

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

import ConfigParser, os 

config = ConfigParser.ConfigParser() 
config.readfp(open('defaults.cfg')) 
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')]) 

यहां तक ​​कि खिड़कियों पर, आप जानते हैं कि रजिस्ट्री मैल और खलनायकी की एक नीच छत्ता है होना चाहिए, और आप उसका उपयोग नहीं किया जाना चाहिए कि:

+1

से संबंधित किसी भी प्रकार का सर्वोत्तम अभ्यास नहीं खो रहा था, कॉन्फ़िगरर्स आईएनआई फाइलों की तरह दिखने वाली फ़ाइलों को पढ़ता और लिखता है, और इन्हें भी बनाया गया है। JSON कुंजी + मान पदानुक्रम के 2 स्तरों के लिए बहुत अच्छा है। –

+0

@WarrenP, मैं हाल ही में जेएसओएन का उपयोग कर रहा हूं, और मुझे लगता है कि यह मेरा जाने-माने प्रारूप बन गया है! लेकिन मैं कॉन्फ़िगरेशन फ़ाइलों के लिए 'ConfigParser' का उपयोग करने के खिलाफ शायद ही बहस कर सकता हूं; अच्छा विचार। – steveha

6

को Python2 ConfigParser, जो configparser, python3 में है अपने पायथन ऐप कॉन्फ़िगरेशन को स्टोर करने के लिए।

+4

'आपको अवगत होना चाहिए कि रजिस्ट्री स्कम और खलनायक का एक दुखी छिद्र है' यह सबसे महत्वपूर्ण बात है जिसे आपको इस पूरे प्रश्न से लेना चाहिए। – Falmarri

+0

धन्यवाद!मैंने थोड़ी देर में विंडोज का व्यापक रूप से उपयोग नहीं किया है, और रजिस्ट्री के समग्र दृश्य के बारे में पूरी तरह से यकीन नहीं था, अगर मैं कर सकता हूं तो मैं इसके बारे में स्पष्ट रहूंगा – Parker

1

ऐसे कई तरीके हैं, दो मुख्य दिशाओं

  • पहुँच _winreg मॉड्यूल के साथ Windows रजिस्ट्री में विभाजित कर रहे हैं।

रजिस्ट्री का उपयोग करना सेटिंग्स को किसी अन्य मशीन में स्थानांतरित करने या उन्हें निरीक्षण करने या उन्हें वापस करने के लिए अनौपचारिक है; आपको उन लोगों के लिए regedit का उपयोग करना होगा।

दूसरी तरफ उपयोगकर्ता के 'माय दस्तावेज़' फ़ोल्डर में फ़ाइल में वरीयताओं को संग्रहीत करते हैं। यह सेटिंग्स को किसी अन्य मशीन या उपयोगकर्ता पर ले जाना आसान बनाता है, और आपके प्रोग्राम की सेटिंग्स को कई अन्य अनुप्रयोगों के साथ मिश्रित नहीं करता है। तो उन्हें समर्थन देने और उन्हें बहाल करने जैसी चीजें आसान हैं; आप बस एक फाइल कॉपी करें। यदि आप एक टेक्स्ट प्रारूप चुनते हैं, तो सेटिंग्स का निरीक्षण और डिबग करना भी आसान है।

  • अपनी सेटिंग्स को एक सूची, टुपल या शब्दकोश में रखें और उन्हें cPickle मॉड्यूल से सहेजें। यह शायद सबसे आसान तरीकों में से एक है। डाउनसाइड पर, जबकि मसालेदार डेटा डिफ़ॉल्ट रूप से एएससीआईआई प्रारूप का उपयोग करता है, यह मानव-पठनीय नहीं है।
  • ConfigParser मॉड्यूल का उपयोग विंडोज़ .ini फ़ाइलों के समान संरचना में कॉन्फ़िगरेशन फ़ाइलों को सहेजने और लोड करने के लिए करें। ये फ़ाइलें मानव-पठनीय हैं।
  • जेसन प्रारूप में सेटिंग्स को स्टोर करने के लिए json मॉड्यूल का उपयोग करें। ये फ़ाइलें मानव-पठनीय हैं।
  • वरीयताओं को पाइथन अभिव्यक्तियों को टेक्स्ट फ़ाइल में सहेजें, इसे execfile() से लोड करें। N.B. इसका उपयोग मनमाने ढंग से कोड निष्पादित करने के लिए किया जा सकता है, इसलिए सुरक्षा विचार हैं। लेकिन ऊपर की तरफ, यह बहुत आसान और पठनीय है।
संबंधित मुद्दे

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