Кросс-платформенный способ получения временного каталога в Python
Существует ли кроссплатформенный способ получения пути к temp
каталогу в Python 2.6?
Например, в Linux это будет /tmp
, а в XP C:\Documents and settings\[user]\Application settings\Temp
.
Ответы
Ответ 1
Это будет 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
Для полноты, здесь, как он ищет временный каталог, в соответствии с документацией:
- Каталог, названный переменной среды
TMPDIR
.
- Каталог, названный переменной среды
TEMP
.
- Каталог, названный переменной среды
TMP
.
- Место для конкретной платформы:
- В RiscOS - каталог, названный переменной среды
Wimp$ScrapDir
.
- В Windows каталоги
C:\TEMP
, C:\TMP
, \TEMP
и \TMP
в этом порядке.
- На всех других платформах каталоги
/tmp
, /var/tmp
и /usr/tmp
в этом порядке.
- В крайнем случае, текущий рабочий каталог.
Ответ 2
Это должно делать то, что вы хотите:
print tempfile.gettempdir()
Для меня на моем ящике Windows я получаю:
c:\temp
и на моем ящике Linux я получаю:
/tmp
Ответ 3
Самый простой способ, основанный на комментариях и ответах @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
. Они просто используют более короткий шестнадцатеричный хэш и специфичный для приложения префикс для "объявления" своего присутствия.
Ответ 4
Я использую:
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'
; это то, что я не хочу!