2012-01-09 10 views
7

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

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

इसलिए मैं /tmp डीआईआर से बचना चाहता हूं, क्योंकि इसे उपयोगकर्ता (?) से साफ़ किया जा सकता है। इसके लिए सबसे अच्छा अभ्यास क्या है?

उत्तर

1

http://pypi.python.org/pypi/appdirs एक पाइथन मॉड्यूल है जो क्रॉस-प्लेटफ़ॉर्म user_cache_dir फ़ंक्शन प्रदान करता है।

+0

वाह, धन्यवाद। मुझे लगता है कि यह जाने का रास्ता है। मैं बस 'user_cache_dir' बनाम' site_data_dir' सोच रहा हूं, जो मेरे मामले के लिए अधिक उपयुक्त है। – umpirsky

8

tempfile.mkdtemp आपके लिए एक temp dir बना देगा और उसका नाम वापस कर देगा। यह डिफ़ॉल्ट रूप से /tmp में (यूनिक्स-जैसी प्रणालियों पर) बना देगा, लेकिन "सबसे सुरक्षित तरीके से संभव" और केवल कॉलर के उपयोगकर्ता आईडी के लिए पढ़ने/लिखने/सूची अनुमतियों के साथ।

>>> d = tempfile.mktemp() 
>>> with open(os.path.join(d, "secret")) as output: 
...  output.write("Ha, you can't read this!") 

(Btw। डिफ़ॉल्ट सेटिंग वाला एक यूनिक्स/लिनक्स सिस्टम पर, उपयोगकर्ताओं को केवल संपादित नहीं कर सकते या /tmp से एक दूसरे की फ़ाइलों को हटा दें।)

+0

हेहम, मैं इसे देख रहा था। तो, मैं भरोसा नहीं कर सकता कि एक बार बनाया गया tempdir हमेशा वहाँ रहेगा? इसके अलावा, मुझे एक बार बनाया गया डीआईआर पथ याद रखना होगा और हर ऐप चलाने पर इसका इस्तेमाल करना होगा, है ना? क्या आप मेरे सभी उपनिवेशियों (गिट रेपो) के लिए एक शीर्ष स्तर के tmpdir बनाने या प्रत्येक के अपने tempdir में अलग करने की सलाह देते हैं? धन्यवाद। – umpirsky

+0

@umpirsky: क्या आप चाहते हैं कि temp dir प्रोग्राम रनों पर बने रहें? –

+0

यह संभवतः '/ tmp' में एक निर्देशिका बनायेगा जो कि ['tempfile.tempdir'] (http://docs.python.org/library/tempfile.html#tempfile.tempdir) के लिए डिफ़ॉल्ट है। – sth

8

मैं कहना चाहता हूँ कि सबसे अच्छा अभ्यास है tempfile.mkdtemp का उपयोग करने के लिए।

import tempfile 
tempfile.mkdtemp(prefix=<your_preferred_directory>) 

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

आप तो /tmp उपयोग करने के लिए वान नहीं है, तो आप prefix पैरामीटर का लाभ ले सकते बारे में क्या आपके आवेदन विन्यास sotre को सबसे उपयुक्त निर्देशिका, संचित डेटा, आदि है यदि आप लिनक्स का उपयोग कर रहे हैं, तो कृपया XDG Base Directory Specification पर एक नज़र डालें।

0

आमतौर पर प्रोग्राम ~/.progname निर्देशिका का उपयोग डेटा को संग्रहीत करने के लिए करते हैं जो कि लगातार होना चाहिए लेकिन उपयोगकर्ता के "रास्ते से बाहर" रहना चाहिए।

2

यदि यह वास्तव में अस्थायी है, तो लार्मन्स की सलाह का पालन करें और mkdtemp का उपयोग करें।

यदि यह किसी प्रकार का अर्ध-स्थायी कैश है जो रीबूट से बचना चाहिए, तो आपको स्थानीय ओएस (% APPDATA%, ~/.local/etc) द्वारा परिभाषित स्थानीय एप्लिकेशन निर्देशिका का उपयोग करना चाहिए; कुछ टूलकिट (उदा। क्यूटी) उस फ़ोल्डर को क्रॉस-प्लेटफ़ॉर्म तरीके से देखने के लिए फ़ंक्शंस प्रदान करते हैं।

संपादित करें: विकिपीडिया से:

  • गृह (यूनिक्स की तरह) और USERPROFILE (माइक्रोसॉफ्ट विंडोज) - जहां एक उपयोगकर्ता के घर निर्देशिका फाइल सिस्टम में स्थित है संकेत मिलता है।
  • होम/{। AppName} (यूनिक्स-जैसी) और APPDATA {डेवलपरनाम \ AppName} (माइक्रोसॉफ्ट विंडोज) - एप्लिकेशन सेटिंग्स संग्रहीत करने के लिए। , USERPROFILE केवल संवादों कि उपयोगकर्ता रास्तों के बीच दस्तावेज की तरह/चित्र/डाउनलोड/संगीत, कार्यक्रम संबंधी उद्देश्यों के लिए कर APPDATA (रोमिंग) चयन करने की अनुमति में इस्तेमाल किया जाना चाहिए - कई खुला स्रोत प्रोग्राम गलत ढंग से आवेदन सेटिंग्स Windows में के लिए USERPROFILE का उपयोग LOCALAPPDATA या ProgramData (उपयोगकर्ताओं के बीच साझा)

तो तुम देखना चाहिए os.environ['APPDATA'] या os.environ['HOME'], मंच के आधार पर (sys.platform देखें) और फिर अपने ऐप में नाम जोड़ने और फिर तुम क्या आप चाहते हैं स्टोर कर सकते हैं।

mydir = os.path.join(".myAppName", "cache") 
homeVar = 'HOME' # default for all *nix variants 
if sys.platform == 'win32': 
    homeVar = 'APPDATA' 
mydir = os.path.join(os.environ[homeVar], mydir) 
0

बस एक यद्यपि: आप Git commit hooks पर गौर कर सकते हैं। इस तरह, नए कामों के लिए एक टीएमपी निर्देशिका की निगरानी करने के बजाय (अजीब लगता है: जो सीमित अनुमतियों के साथ एक टीएमपी निर्देशिका में प्रतिबद्ध होगा?) रेपो आपको प्रतिबद्धता के बारे में सूचित करता है, या अधिक विशेष रूप से, जब भी कोई प्रतिबद्धता होती है तो स्वचालित रूप से स्क्रिप्ट चलाती है ..

+0

मैं किसी प्रकार का गिट मॉनिटर बना रहा हूं, जो मास्टर शाखा में बदलावों के बारे में सूचित करेगा। गिटब्स आरएसएस फ़ीड की तरह एसएचएच। परिवर्तनों का पता लगाने के लिए, मुझे कहीं कहीं रेपो लाने की जरूरत है। यही कारण है कि मुझे टीएमपी डीआईआर की जरूरत है। Thx, – umpirsky

+0

क्या आप इसे स्थायी निर्देशिका में नहीं रखना चाहते हैं, इसलिए जब भी आप परिवर्तनों की जांच करना चाहते हैं तो आपको पूरे रिपो को क्लोन करने की आवश्यकता नहीं है? – a2800276

+0

हाँ, ऐसा लगता है कि मैंने अपना प्रश्न गलत बताया, क्षमा करें। – umpirsky

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