Кросс-платформенный способ получения каталога temp в Python


есть ли кросс-платформенный способ получить путь к temp

4 184

4 ответа:

это было бы tempfile модуль.

он имеет функции для получения временного каталога, а также имеет некоторые ярлыки для создания временных файлов и каталогов в нем, либо с именем, либо без имени.

пример:

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

для полноты картины, вот как он ищет временный каталог, согласно документации:

  1. каталог с именем TMPDIR окружающая среда переменная.
  2. каталог с именем TEMP переменные среды.
  3. каталог с именем TMP переменные среды.
  4. специфическое для платформы местоположение:
    • On RiscOS, каталог с именем Wimp$ScrapDir переменные среды.
    • On Windows каталоги C:\TEMP,C:\TMP,\TEMP и \TMP в этом порядке.
    • на всех других платформах, каталоги /tmp,/var/tmp и /usr/tmp в этом порядке.
  5. в крайнем случае, текущий рабочий каталог.

Это должно делать то, что вы хотите:

print tempfile.gettempdir()

для меня на моем окне Windows, я получаю:

c:\temp

и на моем Linux box я получаю:

/tmp

Я использую:

import platform
import tempfile

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

это потому, что на MacOS, т. е. Дарвин,tempfile.gettempdir() и os.getenv('TMPDIR') возвращает значение, например '/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T'; Это тот, который я не хочу!

принимая важный бит от @nosklo's ответ и добавление полу-частной песочницы dir:

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

таким образом, вы можете легко очистить после себя, когда вы закончите (для конфиденциальности, ресурсов, безопасности, что угодно) с:

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

Это похоже на то, что приложения, такие как Google Chrome и Linux systemd do. Они просто используют более короткий шестнадцатеричный хэш и префикс для приложения, чтобы "рекламировать" свое присутствие.