पायथन में अस्थायी निर्देशिका प्राप्त करने का क्रॉस-प्लेटफ़ॉर्म तरीका


255

क्या tempपायथन 2.6 में निर्देशिका का मार्ग प्राप्त करने का एक क्रॉस-प्लेटफ़ॉर्म तरीका है ?

उदाहरण के लिए, लिनक्स के तहत जो कि /tmpXP के तहत होगा C:\Documents and settings\[user]\Application settings\Temp


नहीं एक pythonist, लेकिन आप का उपयोग करना चाहिए इन तरीकों अस्थायी फ़ाइलें / निर्देशिका बनाने के लिए
skrat

जवाबों:


380

यह टेम्पोफाइल मॉड्यूल होगा।

इसके पास अस्थायी निर्देशिका प्राप्त करने के लिए फ़ंक्शंस हैं, और इसमें अस्थायी फ़ाइलें और निर्देशिका बनाने के लिए कुछ शॉर्टकट भी हैं, या तो नामांकित या अनाम।

उदाहरण:

import tempfile

print tempfile.gettempdir() # prints the current temporary directory

f = tempfile.TemporaryFile()
f.write('something on temporaryfile')
f.seek(0) # return to beginning of file
print f.read() # reads data back from the file
f.close() # temporary file is automatically deleted here

पूर्णता के लिए, यहां दस्तावेज़ीकरण के अनुसार, यह अस्थायी निर्देशिका कैसे खोजता है:

  1. TMPDIRपर्यावरण चर द्वारा नामित निर्देशिका ।
  2. TEMPपर्यावरण चर द्वारा नामित निर्देशिका ।
  3. TMPपर्यावरण चर द्वारा नामित निर्देशिका ।
  4. एक प्लेटफ़ॉर्म-विशिष्ट स्थान:
    • पर RiscOS , निर्देशिका द्वारा नामित Wimp$ScrapDirवातावरण चर।
    • पर विंडोज , निर्देशिका C:\TEMP, C:\TMP, \TEMP, और \TMPइसी क्रम में।
    • अन्य सभी प्लेटफार्मों, निर्देशिका पर /tmp, /var/tmpहै, और /usr/tmpइसी क्रम में।
  5. अंतिम उपाय के रूप में, वर्तमान कार्यशील निर्देशिका।

7
मेरे लिए, OSX इसे /var/folders/<garbage/here>इसके बजाय डाल रहा है /tmpक्योंकि $TMPDIRयह सेट है। देखें यहाँ
रिक स्मिथ

3
वर्तमान में, विंडोज 10 पर अजगर 3.6.5 के साथ, को tempfile.gettempdir()हल करता है C:\users\user\AppData\Local\Temp। दुर्भाग्य से लंबा रास्ता।
solutionJ

61

यह वही करना चाहिए जो आप चाहते हैं:

print tempfile.gettempdir()

मेरे लिए मेरे विंडोज बॉक्स पर, मुझे मिलता है:

c:\temp

और मेरे लिनक्स बॉक्स पर मुझे:

/tmp

15

मैं उपयोग करता हूं:

from pathlib import Path
import platform
import tempfile

tempdir = Path("/tmp" if platform.system() == "Darwin" else tempfile.gettempdir())

ऐसा इसलिए है क्योंकि MacOS, यानी डार्विन, tempfile.gettempdir()और os.getenv('TMPDIR')जैसे कि एक मूल्य वापस '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; यह वह है जिसे मैं हमेशा नहीं चाहता।


1
कम से कम इस मामले में MacOS आपको उपयोगकर्ता-स्तर वाले पृथक अस्थायी निर्देशिका को वापस करने का सही काम करता है। मुझे 99.99% यकीन है कि आपको यही चाहिए .... जब तक आप ऑपरेटिंग सिस्टम के साथ गड़बड़ नहीं करना चाहते।
सोरिन

1
@sorin 99.99% एक खिंचाव है। मैं कहूंगा कि 50% अधिक यथार्थवादी है। अक्सर मैं मल्टीप्रोसेसिंग के साथ काम कर रहा हूं और फिर मैं सभी प्रक्रियाओं के लिए एक ही अस्थायी डीआईआर चाहता हूं।
एक्यूमेनस

11

@ Nosklo की टिप्पणी और उत्तर के आधार पर सबसे सरल तरीका :

import tempfile
tmp = tempfile.mkdtemp()

लेकिन अगर आप निर्देशिकाओं के निर्माण को मैन्युअल रूप से नियंत्रित करना चाहते हैं:

import os
from tempfile import gettempdir
tmp = os.path.join(gettempdir(), '.{}'.format(hash(os.times())))
os.makedirs(tmp)

इस तरह से आप आसानी से अपने आप को साफ कर सकते हैं जब आपके साथ किया जाता है (गोपनीयता, संसाधन, सुरक्षा, जो भी हो) के साथ:

from shutil import rmtree
rmtree(tmp, ignore_errors=True)

यह Google Chrome और Linux जैसे अनुप्रयोगों के लिए समान systemdहै। वे बस अपनी उपस्थिति को "विज्ञापित" करने के लिए एक छोटी हेक्स हैश और एक ऐप-विशिष्ट उपसर्ग का उपयोग करते हैं।


1
आप tempfile.mkdtemp()इसके बजाय का उपयोग करना चाहिए
nosklo

@nosklo, यह निश्चित रूप से एक विकल्प है, और टेम्पोफाइल पैकेज में निर्मित सभी मजबूती का लाभ उठाएगा, लेकिन हैश दृष्टिकोण आपको एक निर्देशिका ट्री में अपने चयन और घोंसले के कई निर्देशिकाओं का पथ बनाने देता है जो आपकी आवश्यकताओं को पूरा करता है। यह मूल रूप से mkdtemp()आपके द्वारा सुझाए गए अधिक स्पष्ट, अधिक लचीले संस्करण है ।
होब्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.