Forma multiplataforma de obtener el directorio temporal en Python

Resuelto Joril asked hace 15 años • 5 respuestas

¿Existe una forma multiplataforma de obtener la ruta al tempdirectorio en Python 2.6?

Por ejemplo, en Linux sería /tmp, mientras que en XP C:\Documents and settings\[user]\Application settings\Temp.

Joril avatar May 11 '09 19:05 Joril
Aceptado

Ese sería el módulo de archivo temporal .

Tiene funciones para obtener el directorio temporal y también tiene algunos atajos para crear archivos y directorios temporales en él, ya sea con nombre 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, según 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 Windows , los directorios C:\TEMP, C:\TMP, \TEMPy \TMP, en ese orden.
    • En todas las demás plataformas, los directorios /tmp, /var/tmpy /usr/tmp, en ese orden.
  5. Como último recurso, el directorio de trabajo actual.
nosklo avatar May 11 '2009 12:05 nosklo

Esto debería hacer lo que quieres:

print(tempfile.gettempdir())

Para mí, en mi caja de Windows, obtengo:

c:\temp

y en mi caja de Linux me sale:

/tmp
RichieHindle avatar May 11 '2009 12:05 RichieHindle

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()devuelve os.getenv('TMPDIR')un valor como '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; es uno que no siempre quiero.

Asclepius avatar Apr 14 '2017 19:04 Asclepius

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

import tempfile
tmp = tempfile.mkdtemp()

Pero si deseas 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, puedes limpiar fácilmente cuando hayas terminado (por privacidad, recursos, seguridad, lo que sea) con:

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

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

hobs avatar May 10 '2016 20:05 hobs