Manera multiplataforma de obtener el directorio temporal en Python

4 minutos de lectura

avatar de usuario
Joril

¿Existe una forma multiplataforma de obtener el camino a la temp directorio en Python 2.6?

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

  • no es un pythonista, pero deberías usar estas métodos para crear archivos/directorios temporales

    – skrat

    11 de mayo de 2009 a las 12:26

  • Consulte el módulo de archivo temporal en docs.python.org/library/tempfile.html.

    – Jordan Parmer

    11 de mayo de 2009 a las 12:26

avatar de usuario
nosklo

ese seria el archivo temporal módulo.

Tiene funciones para obtener el directorio temporal, y también tiene algunos accesos directos para crear archivos y directorios temporales en él, 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 el TMPDIR Variable ambiental.
  2. El directorio nombrado por el TEMP Variable ambiental.
  3. El directorio nombrado por el TMP Variable ambiental.
  4. Una ubicación específica de la plataforma:
    • En RiscOSel directorio nombrado por el Wimp$ScrapDir Variable ambiental.
    • En ventanaslos directorios C:\TEMP, C:\TMP, \TEMPy \TMPen ese orden.
    • En todas las demás plataformas, los directorios /tmp, /var/tmpy /usr/tmpen ese orden.
  5. Como último recurso, el directorio de trabajo actual.

  • Para mí, OSX lo está poniendo en /var/folders/<garbage/here> en vez de /tmp porque así es como $TMPDIR Está establecido. Ver aquí.

    –Rick Smith

    19 de enero de 2017 a las 16:49

  • Actualmente, con Python 3.6.5 en Windows 10, tempfile.gettempdir() resuelve a C:\users\user\AppData\Local\Temp. Un camino lamentablemente largo.

    – resolviendoJ

    25 de abril de 2018 a las 20:17

avatar de usuario
RichieHindle

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

  • pero esto no funciona para MacOS… La respuesta de Asclepius es para MacOS la mejor opción

    – Juan MC

    6 sep 2021 a las 16:26

  • @JohnMC Funciona para MacOS, aunque MacOS informa una ruta más larga y menos memorable que otras plataformas

    – Beda Constantinides

    29 de julio a las 19:16

avatar de usuario
Asclepio

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

  • 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 necesitas… a menos que quieras meterte con el sistema operativo.

    – sorin

    7 de junio de 2019 a las 14:58

  • @sorin 99.99% es exagerado. 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.

    – Asclepio

    3 de enero de 2020 a las 0:03

  • @Acumenus, de hecho, hasta donde yo sé, Sorin tiene razón. su suposición de que el TMPDIR en osx será diferente para cada proceso es incorrecta. Sin embargo, el TMPDIR es por usuario por sesión. Esta ubicación se limpia al reiniciar. Si quiere convencerse a sí mismo, pruebe un código Python que muestre el TMPDIR y lo guarde en testTempdir.py. Luego haga esto en su terminal. for ((i=0;i<20;i++)) do;./testTempDir.py&;echo $!;done. Verá 20 ≠ ID de proceso y 20 veces el mismo TMPDIR

    – Stéphane Gasparini

    22 de julio de 2021 a las 7:10


  • @StephaneGasparini, cierto, pero a veces necesita procesos separados de padres separados (sesiones), y esto es más multiplataforma

    – Mel Mass

    29 de agosto de 2021 a las 16:49

  • @Asclepius TMPDIR es una variable de entorno que expresa el resultado de NSTemporaryDirectory por lo que sé. La documentación de la API dice que es por usuario ver desarrollador.apple.com/documentation/foundation/…. ver también stackoverflow.com/questions/10293348/…

    – Stéphane Gasparini

    31 de agosto de 2021 a las 15:56


avatar de usuario
placas

La forma más sencilla, 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 lo que ensucia 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 hacer. Simplemente usan un hash hexadecimal más corto y un prefijo específico de la aplicación para “anunciar” su presencia.

¿Por qué tantas respuestas complejas?

solo uso esto

   (os.getenv("TEMP") if os.name=="nt" else "/tmp") + os.path.sep + "tempfilename.tmp"

  • ¿Cómo es esto menos complejo que otras respuestas?

    – Vacaciones crujientes

    8 de junio a las 6:25

  • ¿Cómo es esto menos complejo que otras respuestas?

    – Vacaciones crujientes

    8 de junio a las 6:25

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad