Wieloplatformowy sposób uzyskania katalogu tymczasowego w Pythonie

255

Czy istnieje wieloplatformowy sposób na uzyskanie ścieżki do temp katalogu w Pythonie 2.6?

Na przykład pod Linuksem, który byłby /tmp, podczas gdy pod XP C:\Documents and settings\[user]\Application settings\Temp.

Joril
źródło
nie jest pythonistą, ale powinieneś używać tych metod do tworzenia tymczasowych plików / katalogów
skrat
1
Zobacz moduł tempfile na docs.python.org/library/tempfile.html .
Jordan Parmer

Odpowiedzi:

380

To byłby moduł tymczasowy .

Ma funkcje pobierania katalogu tymczasowego, a także kilka skrótów do tworzenia w nim plików tymczasowych i katalogów, nazwanych lub nienazwanych.

Przykład:

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

Dla kompletności, oto jak szuka katalogu tymczasowego, zgodnie z dokumentacją:

  1. Katalog nazwany przez TMPDIRzmienną środowiskową.
  2. Katalog nazwany przez TEMPzmienną środowiskową.
  3. Katalog nazwany przez TMPzmienną środowiskową.
  4. Lokalizacja specyficzna dla platformy:
    • W RiscOS: katalog nazwany przezWimp$ScrapDir zmienną środowiskową.
    • Na systemie Windows , katalogi C:\TEMP, C:\TMP, \TEMP, i \TMP, w tej kolejności.
    • Na wszystkich innych platformach, katalogi /tmp, /var/tmporaz /usr/tmp, w takiej kolejności.
  5. W ostateczności aktualny katalog roboczy.
nosklo
źródło
7
Dla mnie OSX wstawia go /var/folders/<garbage/here>zamiast, /tmpponieważ tak $TMPDIRjest ustawiony. Zobacz tutaj .
Rick Smith,
3
Obecnie, z python 3.6.5 na Windows 10, tempfile.gettempdir()rozwiązuje C:\users\user\AppData\Local\Temp. Niestety długa ścieżka.
rozwiązanieJ
61

To powinno zrobić, co chcesz:

print tempfile.gettempdir()

Dla mnie na moim systemie Windows otrzymuję:

c:\temp

a na moim Linux-ie otrzymuję:

/tmp
RichieHindle
źródło
15

Używam:

from pathlib import Path
import platform
import tempfile

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

To dlatego, że na MacOS, czyli Darwin, tempfile.gettempdir()i os.getenv('TMPDIR')zwraca wartość takich jak '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; jest to taki, którego nie zawsze chcę.

Acumenus
źródło
1
Przynajmniej w tym przypadku MacOS robi dobrze, zwracając ci izolowany katalog tymczasowy na poziomie użytkownika. Jestem 99,99% pewien, że tego właśnie potrzebujesz .... chyba że chcesz zepsuć system operacyjny.
sorin
1
@sorin 99,99% to odcinek. Powiedziałbym, że 50% jest bardziej realistyczne. Często pracuję z przetwarzaniem wieloprocesowym, a potem mógłbym chcieć mieć ten sam katalog temp dla wszystkich procesów.
Acumenus
11

Najprostszy sposób, oparty na komentarzu i odpowiedzi @ nosklo :

import tempfile
tmp = tempfile.mkdtemp()

Ale jeśli chcesz ręcznie kontrolować tworzenie katalogów:

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

W ten sposób możesz łatwo posprzątać po sobie, gdy skończysz (dla prywatności, zasobów, bezpieczeństwa itp.) Dzięki:

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

Jest to podobne do działania aplikacji takich jak Google Chrome i Linux systemd. Używają tylko krótszego skrótu szesnastkowego i prefiksu specyficznego dla aplikacji do „reklamowania” swojej obecności.

płyty grzewcze
źródło
1
powinieneś użyć tempfile.mkdtemp()zamiast tego
nosklo
@nosklo, to z pewnością opcja, która wykorzystałaby całą solidność wbudowaną w pakiet tempfile, ale podejście hash pozwala ci stworzyć wybraną ścieżkę i zagnieżdżać wiele katalogów w drzewie katalogów, które spełnia twoje wymagania. Jest to w zasadzie bardziej wyraźna, bardziej elastyczna wersja, mkdtemp()którą zasugerowałeś.
płyty grzewcze