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


255

Существует ли кроссплатформенный способ получения пути к tempкаталогу в Python 2.6?

Например, под Linux это было бы /tmp, а под XP C:\Documents and settings\[user]\Application settings\Temp.


не питонист, но вы должны использовать эти методы для создания временных файлов / каталогов
скрат

1
Смотрите модуль tempfile по адресу docs.python.org/library/tempfile.html .
Джордан Пармер

Ответы:


381

Это был бы модуль временного файла .

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

Пример:

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. Местоположение для конкретной платформы:
    • В RiscOS - каталог с именем Wimp$ScrapDirпеременной среды.
    • В ОС Windows , каталоги C:\TEMP, C:\TMP, \TEMPи \TMP, в таком порядке.
    • На всех остальных платформах, каталогов /tmp, /var/tmpи /usr/tmp, в таком порядке.
  5. В крайнем случае, текущий рабочий каталог.

7
Для меня OSX вставляет это /var/folders/<garbage/here>вместо того, /tmpпотому что так $TMPDIRнастроено. Смотрите здесь .
Рик Смит

3
В настоящее время, с python 3.6.5 на Windows 10, tempfile.gettempdir()разрешается в C:\users\user\AppData\Local\Temp. К сожалению, долгий путь.
решениеJ

61

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

print tempfile.gettempdir()

Для меня на моей коробке Windows, я получаю:

c:\temp

и на моей коробке Linux я получаю:

/tmp

15

Я использую:

from pathlib import Path
import platform
import tempfile

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

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


1
По крайней мере, в этом случае MacOS правильно возвращает вам изолированный временный каталог на уровне пользователя. Я на 99,99% уверен, что это то, что вам нужно .... если только вы не хотите связываться с операционной системой.
сорин

1
@ Сорин 99,99% это натяжение. Я бы сказал, что 50% более реалистично. Часто я работаю с многопроцессорностью, и тогда мне может понадобиться один и тот же временный каталог для всех процессов.
Acumenus

11

Самый простой способ, основанный на комментариях и ответах @ nosklo :

import tempfile
tmp = tempfile.mkdtemp()

Но если вы хотите вручную контролировать создание каталогов:

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


1
Вы должны использовать tempfile.mkdtemp()вместо этого
nosklo

@nosklo, это, безусловно, вариант, и он будет использовать все преимущества надежности, встроенные в пакет tempfile, но подход хэширования позволяет вам создать путь по вашему выбору и вложить несколько каталогов в дерево каталогов, которое соответствует вашим требованиям. Это в основном более явная, более гибкая версия, которую mkdtemp()вы предложили.
варочные панели
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.