Plattformübergreifende Methode zum Abrufen eines temporären Verzeichnisses in Python

255

Gibt es eine plattformübergreifende Möglichkeit, den Pfad zum tempVerzeichnis in Python 2.6 abzurufen?

Zum Beispiel unter Linux /tmp, während unter XP C:\Documents and settings\[user]\Application settings\Temp.

Joril
quelle
kein Pythonist, aber Sie sollten diese Methoden zum Erstellen temporärer Dateien / Verzeichnisse verwenden
skrat
1
Weitere Informationen finden Sie im tempfile-Modul unter docs.python.org/library/tempfile.html .
Jordan Parmer

Antworten:

379

Das wäre das tempfile- Modul.

Es verfügt über Funktionen zum Abrufen des temporären Verzeichnisses sowie über einige Verknüpfungen zum Erstellen temporärer Dateien und Verzeichnisse, entweder mit oder ohne Namen.

Beispiel:

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

Der Vollständigkeit halber wird im Dokument gemäß der Dokumentation nach dem temporären Verzeichnis gesucht:

  1. Das von der TMPDIRUmgebungsvariablen benannte Verzeichnis .
  2. Das von der TEMPUmgebungsvariablen benannte Verzeichnis .
  3. Das von der TMPUmgebungsvariablen benannte Verzeichnis .
  4. Ein plattformspezifischer Standort:
    • Unter RiscOS das von der Wimp$ScrapDirUmgebungsvariablen benannte Verzeichnis .
    • Auf Windows - , die Verzeichnisse C:\TEMP, C:\TMP, \TEMP, und \TMP, in dieser Reihenfolge.
    • Auf allen anderen Plattformen, die Verzeichnisse /tmp, /var/tmpund /usr/tmpin dieser Reihenfolge.
  5. Als letztes Mittel das aktuelle Arbeitsverzeichnis.
nosklo
quelle
7
Für mich ist OSX es bei der Umsetzung /var/folders/<garbage/here>statt , /tmpweil das ist , wie $TMPDIRfestgelegt ist. Siehe hier .
Rick Smith
3
Derzeit mit Python 3.6.5 auf 10 Windows tempfile.gettempdir()behebt zu C:\users\user\AppData\Local\Temp. Ein leider langer Weg.
LösenJ
61

Dies sollte tun, was Sie wollen:

print tempfile.gettempdir()

Für mich auf meiner Windows-Box bekomme ich:

c:\temp

und auf meiner Linux-Box bekomme ich:

/tmp
RichieHindle
quelle
15

Ich benutze:

from pathlib import Path
import platform
import tempfile

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

Dies liegt daran , auf MacOS, dh Darwin, tempfile.gettempdir()und os.getenv('TMPDIR')gibt einen Wert wie '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; es ist eines, das ich nicht immer will.

Scharfsinn
quelle
1
Zumindest in diesem Fall unternimmt MacOS das Richtige, um Ihnen ein isoliertes temporäres Verzeichnis auf Benutzerebene zurückzugeben. Ich bin mir zu 99,99% sicher, dass dies das ist, was Sie brauchen ... es sei denn, Sie möchten sich mit dem Betriebssystem anlegen.
Sorin
1
@ Sorin 99,99% ist eine Strecke. Ich würde sagen, 50% sind realistischer. Oft arbeite ich mit Multiprocessing und möchte dann für alle Prozesse das gleiche temporäre Verzeichnis.
Acumenus
11

Der einfachste Weg, basierend auf @ nosklos Kommentar und Antwort :

import tempfile
tmp = tempfile.mkdtemp()

Wenn Sie jedoch die Erstellung der Verzeichnisse manuell steuern möchten:

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

Auf diese Weise können Sie leicht nach sich selbst aufräumen, wenn Sie fertig sind (für Datenschutz, Ressourcen, Sicherheit, was auch immer) mit:

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

Dies ähnelt dem, was Anwendungen wie Google Chrome und Linux systemdtun. Sie verwenden nur einen kürzeren Hex-Hash und ein App-spezifisches Präfix, um für ihre Anwesenheit zu "werben".

Kochfelder
quelle
1
Sie sollten tempfile.mkdtemp()stattdessen verwenden
Nosklo
@nosklo, das ist sicherlich eine Option und würde die Robustheit des tempfile-Pakets nutzen. Mit dem Hash-Ansatz können Sie jedoch einen Pfad Ihrer Wahl erstellen und mehrere Verzeichnisse in einem Verzeichnisbaum verschachteln, der Ihren Anforderungen entspricht. Es ist im Grunde eine explizitere, flexiblere Version des von mkdtemp()Ihnen vorgeschlagenen.
Kochfelder