Forma multiplataforma de obtener el directorio temporal en Python

Respuestas:

379

Ese sería el módulo temporal .

Tiene funciones para obtener el directorio temporal, y también tiene algunos accesos directos para crear archivos y directorios temporales, ya sea con o sin nombre.

Ejemplo:

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

Para completar, así es como busca el directorio temporal, de acuerdo con la documentación:

  1. El directorio nombrado por la TMPDIRvariable de entorno.
  2. El directorio nombrado por la TEMPvariable de entorno.
  3. El directorio nombrado por la TMPvariable de entorno.
  4. Una ubicación específica de la plataforma:
    • En RiscOS , el directorio nombrado por la Wimp$ScrapDirvariable de entorno.
    • En de Windows , los directorios C:\TEMP, C:\TMP, \TEMP, y \TMP, en ese orden.
    • En las demás plataformas, los directorios /tmp, /var/tmpy /usr/tmp, en ese orden.
  5. Como último recurso, el directorio de trabajo actual.
nosklo
fuente
77
Para mí, OSX lo está colocando en /var/folders/<garbage/here>lugar de /tmpporque así es como $TMPDIRse configura. Ver aquí .
Rick Smith
3
Actualmente, con python 3.6.5 en Windows 10, se tempfile.gettempdir()resuelve C:\users\user\AppData\Local\Temp. Un camino lamentablemente largo.
resolviendoJ
61

Esto debería hacer lo que quieras:

print tempfile.gettempdir()

Para mí en mi caja de Windows, obtengo:

c:\temp

y en mi caja de Linux obtengo:

/tmp
RichieHindle
fuente
15

Yo suelo:

from pathlib import Path
import platform
import tempfile

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

Esto se debe a que en MacOS, es decir, Darwin, tempfile.gettempdir()y os.getenv('TMPDIR')devuelve un valor como '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; Es uno que no siempre quiero.

Acumenus
fuente
1
Al menos en este caso, MacOS hace lo correcto al devolverle un directorio temporal aislado a nivel de usuario. Estoy 99.99% seguro de que esto es lo que necesita ... a menos que quiera meterse con el sistema operativo.
sorin
1
@sorin 99.99% es un estiramiento. Yo diría que el 50% es más realista. A menudo estoy trabajando con multiprocesamiento y luego podría querer el mismo directorio temporal para todos los procesos.
Acumenus
11

La forma más simple, basada en el comentario y la respuesta de @ nosklo :

import tempfile
tmp = tempfile.mkdtemp()

Pero si desea controlar manualmente la creación de los directorios:

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

De esa manera, puede limpiar fácilmente después de usted mismo cuando haya terminado (por privacidad, recursos, seguridad, lo que sea) con:

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

Esto es similar a lo que hacen aplicaciones como Google Chrome y Linux systemd. Solo usan un hash hexadecimal más corto y un prefijo específico de la aplicación para "anunciar" su presencia.

placas
fuente
1
deberías usar tempfile.mkdtemp()en su lugar
nosklo
@nosklo, esa es ciertamente una opción, y aprovecharía toda la robustez incorporada en el paquete temporal, pero el enfoque hash le permite crear una ruta de su elección y anidar múltiples directorios en un árbol de directorios que cumpla con sus requisitos. Básicamente es una versión más explícita y más flexible de lo mkdtemp()que sugirió.
placas