Міжплатформний спосіб отримання тимчасового каталогу в Python


255

Чи існує міжплатформний спосіб отримати шлях до tempкаталогу в Python 2.6?

Наприклад, під Linux це було б /tmp, а під XP C:\Documents and settings\[user]\Application settings\Temp.


не пітоніст, але ви повинні використовувати ці методи для створення тимчасових файлів / каталогів
skrat

Відповіді:


381

Це був би модуль 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. Місце, яке залежить від платформи:
    • У 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% впевнений, що це те, що вам потрібно .... якщо ви не хочете возитися з операційною системою.
sorin

1
@sorin 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)

Це схоже на те, що systemdроблять такі програми, як Google Chrome та Linux . Вони просто використовують коротший шістнадцятковий хеш і специфічний для програми приклад, щоб "рекламувати" свою присутність.


1
ви повинні використовувати tempfile.mkdtemp()замість цього
nosklo

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