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

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

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()

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

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. Они просто используют более короткий шестнадцатеричный хэш и префикс приложения, чтобы "рекламировать" свое присутствие.