Manière multiplateforme d'obtenir le répertoire temporaire en Python

255

Existe-t-il un moyen multiplateforme d'obtenir le chemin d'accès au temprépertoire dans Python 2.6?

Par exemple, sous Linux, ce serait /tmp, tandis que sous XP C:\Documents and settings\[user]\Application settings\Temp.

Joril
la source
pas un pythoniste, mais vous devez utiliser ces méthodes pour créer des fichiers / répertoires temporaires
skrat
1
Voir le module tempfile sur docs.python.org/library/tempfile.html .
Jordan Parmer

Réponses:

379

Ce serait le module tempfile .

Il a des fonctions pour obtenir le répertoire temporaire, et possède également des raccourcis pour y créer des fichiers et des répertoires temporaires, nommés ou non.

Exemple:

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

Pour être complet, voici comment il recherche le répertoire temporaire, selon la documentation:

  1. Répertoire nommé par la TMPDIRvariable d'environnement.
  2. Répertoire nommé par la TEMPvariable d'environnement.
  3. Répertoire nommé par la TMPvariable d'environnement.
  4. Un emplacement spécifique à la plateforme:
    • Sur RiscOS , le répertoire nommé par la Wimp$ScrapDirvariable d'environnement.
    • Sur de Windows , les répertoires C:\TEMP, C:\TMP, \TEMPet \TMP, dans cet ordre.
    • Sur toutes les autres plates - formes, les répertoires /tmp, /var/tmpet /usr/tmp, dans cet ordre.
  5. En dernier recours, le répertoire de travail actuel.
nosklo
la source
7
Pour moi, OSX le met au /var/folders/<garbage/here>lieu de /tmpparce que c'est comme ça que ça se $TMPDIRpasse. Voyez ici .
Rick Smith
3
Actuellement, avec python 3.6.5 sur Windows 10, se tempfile.gettempdir()résout en C:\users\user\AppData\Local\Temp. Un chemin malheureusement long.
resolutionJ
61

Cela devrait faire ce que vous voulez:

print tempfile.gettempdir()

Pour moi sur ma box Windows, j'obtiens:

c:\temp

et sur ma box Linux je reçois:

/tmp
RichieHindle
la source
15

J'utilise:

from pathlib import Path
import platform
import tempfile

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

En effet, sur MacOS, c'est-à-dire Darwin, tempfile.gettempdir()et os.getenv('TMPDIR')retourne une valeur telle que '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; c'est celle que je ne veux pas toujours.

Acumenus
la source
1
Au moins dans ce cas, MacOS fait la bonne chose en vous renvoyant un répertoire temporaire isolé au niveau de l'utilisateur. Je suis sûr à 99,99% que c'est ce dont vous avez besoin ... à moins que vous ne vouliez jouer avec le système d'exploitation.
sorin
1
@sorin 99.99% est un stretch. Je dirais que 50% est plus réaliste. Souvent, je travaille avec le multitraitement et je pourrais alors vouloir le même répertoire temporaire pour tous les processus.
Acumenus
11

La manière la plus simple, basée sur le commentaire et la réponse de @ nosklo :

import tempfile
tmp = tempfile.mkdtemp()

Mais si vous souhaitez contrôler manuellement la création des répertoires:

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

De cette façon, vous pouvez facilement nettoyer après vous lorsque vous avez terminé (pour la confidentialité, les ressources, la sécurité, etc.) avec:

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

Ceci est similaire à ce que font des applications comme Google Chrome et Linux systemd. Ils utilisent simplement un hachage hexadécimal plus court et un préfixe spécifique à l'application pour "annoncer" leur présence.

plaques de cuisson
la source
1
vous devriez utiliser à la tempfile.mkdtemp()place
nosklo
@nosklo, c'est certainement une option, et profiterait de toute la robustesse intégrée au package tempfile, mais l'approche de hachage vous permet de créer un chemin de votre choix et d'imbriquer plusieurs répertoires dans une arborescence de répertoires qui répond à vos besoins. Il s'agit essentiellement d'une version plus explicite et plus flexible de celle que mkdtemp()vous avez suggérée.
plaques de cuisson