web-dev-qa-db-fra.com

Méthode multi-plateforme pour obtenir le répertoire temporaire dans Python

Existe-t-il un moyen multiplateforme d’obtenir le chemin du répertoire temp dans Python 2.6?)?

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

210
Joril

Ce serait le module tempfile .

Il a des fonctions pour obtenir le répertoire temporaire et quelques raccourcis pour créer des fichiers et 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, en fonction de la documentation:

  1. Le répertoire nommé par la variable d'environnement TMPDIR.
  2. Le répertoire nommé par la variable d'environnement TEMP.
  3. Le répertoire nommé par la variable d'environnement TMP.
  4. Un emplacement spécifique à la plate-forme:
    • Sur RiscOS , le répertoire nommé par le Wimp$ScrapDir variable d'environnement.
    • Sur Windows , les répertoires C:\TEMP, C:\TMP, \TEMP, et \TMP, dans cet ordre.
    • Sur toutes les autres plateformes, les répertoires /tmp, /var/tmp, et /usr/tmp, dans cet ordre.
  5. En dernier recours, le répertoire de travail actuel.
317
nosklo

Cela devrait faire ce que vous voulez:

print tempfile.gettempdir()

Pour moi sur ma machine Windows, je reçois:

c:\temp

et sur ma machine Linux je reçois:

/tmp
57
RichieHindle

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

import tempfile
tmp = tempfile.mkdtemp()

Mais si vous voulez 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 aux applications telles que Google Chrome et Linux systemd do.). Elles utilisent simplement un hachage hexagonal plus court et un préfixe spécifique à l'application pour "annoncer" leur présence.

10
hobs

J'utilise:

import platform
import tempfile

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

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

9
Acumenus