Modo multipiattaforma per ottenere la directory temporanea in Python


255

Esiste un modo multipiattaforma per ottenere il percorso della tempdirectory in Python 2.6?

Ad esempio, sotto Linux sarebbe /tmp, mentre sotto XP C:\Documents and settings\[user]\Application settings\Temp.


non un pitone, ma dovresti usare questi metodi per creare file / directory temporanei
skrat,

1
Vedi il modulo tempfile su docs.python.org/library/tempfile.html .
Jordan Parmer,

Risposte:


379

Quello sarebbe il modulo tempfile .

Ha funzioni per ottenere la directory temporanea e ha anche alcune scorciatoie per creare file e directory temporanei, con o senza nome.

Esempio:

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

Per completezza, ecco come cerca la directory temporanea, secondo la documentazione:

  1. La directory denominata dalla TMPDIRvariabile di ambiente.
  2. La directory denominata dalla TEMPvariabile di ambiente.
  3. La directory denominata dalla TMPvariabile di ambiente.
  4. Una posizione specifica della piattaforma:
    • Su RiscOS , la directory denominata dalla Wimp$ScrapDirvariabile d'ambiente.
    • Su di Windows , le directory C:\TEMP, C:\TMP, \TEMP, e \TMP, in questo ordine.
    • Su tutte le altre piattaforme, le directory /tmp, /var/tmpe /usr/tmp, in questo ordine.
  5. Come ultima risorsa, l'attuale directory di lavoro.

7
Per me, OSX lo sta inserendo /var/folders/<garbage/here>anziché /tmpperché è così che $TMPDIRviene impostato. Vedi qui .
Rick Smith,

3
Attualmente, con Python 3.6.5 su Windows 10, si tempfile.gettempdir()risolve C:\users\user\AppData\Local\Temp. Un percorso purtroppo lungo.
risolvendo il

61

Questo dovrebbe fare quello che vuoi:

print tempfile.gettempdir()

Per me sul mio box di Windows, ottengo:

c:\temp

e sul mio Linux box ottengo:

/tmp

15

Io uso:

from pathlib import Path
import platform
import tempfile

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

Questo perché su MacOS, ovvero Darwin, tempfile.gettempdir()e os.getenv('TMPDIR')restituiscono un valore come '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; è quello che non sempre voglio.


1
Almeno in questo caso MacOS fa la cosa giusta per restituirti una directory temporanea isolata a livello di utente. Sono sicuro al 99,99% che questo è quello che ti serve .... a meno che tu non voglia fare confusione con il sistema operativo.
sorin,

1
@sorin 99,99% è un allungamento. Direi che il 50% è più realistico. Spesso sto lavorando con il multiprocessing e quindi potrei desiderare la stessa temp temp per tutti i processi.
Acumenus

11

Il modo più semplice, basato sul commento e sulla risposta di @nosklo :

import tempfile
tmp = tempfile.mkdtemp()

Ma se vuoi controllare manualmente la creazione delle directory:

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

In questo modo puoi facilmente ripulire dopo te stesso quando hai finito (per privacy, risorse, sicurezza, qualunque cosa) con:

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

Questo è simile a quello che fanno applicazioni come Google Chrome e Linux systemd. Usano solo un hash esadecimale più corto e un prefisso specifico dell'app per "pubblicizzare" la loro presenza.


1
dovresti usare tempfile.mkdtemp()invece
nosklo

@nosklo, questa è certamente un'opzione e trarrebbe vantaggio da tutta la solidità integrata nel pacchetto tempfile, ma l'approccio hash ti consente di creare un percorso a tua scelta e annidare più directory in un albero di directory che soddisfa i tuoi requisiti. È fondamentalmente una versione più esplicita e più flessibile del mkdtemp()tuo suggerito.
piani cottura
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.