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

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

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

Ответы [ 4 ]

305 голосов
/ 11 мая 2009

Это будет модуль 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.
    • В Windows , каталоги C:\TEMP, C:\TMP, \TEMP и \TMP в указанном порядке.
    • На всех других платформах каталоги /tmp, /var/tmp и /usr/tmp в указанном порядке.
  5. В крайнем случае, текущий рабочий каталог.
56 голосов
/ 11 мая 2009

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

print tempfile.gettempdir()

Для меня в окне Windows я получаю:

c:\temp

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

/tmp
10 голосов
/ 10 мая 2016

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

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

8 голосов
/ 14 апреля 2017

Я использую:

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'; это то, чего я не хочу!

...