Forma multiplataforma de obtener el directorio temporal en Python


255

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

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


no es un pitonista, pero debe usar estos métodos para crear archivos / directorios temporales
skrat

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.

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

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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.