Временный каталог сохраняется во время выполнения программы - PullRequest
7 голосов
/ 09 января 2012

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

Я буду использовать этот каталог для размещения репозиториев git, которые я хочу отслеживать для новых коммитов, поэтому мне нужно постоянно их где-то хранить.

Поэтому я хочу избежать /tmp dir, так как он может быть очищен пользователем (?). Какова лучшая практика для этого?

Ответы [ 6 ]

8 голосов
/ 09 января 2012

Я бы сказал, что лучше всего использовать tempfile.mkdtemp.

Если вы не хотите использовать /tmp, вы можете воспользоваться параметром prefix:

import tempfile
tempfile.mkdtemp(prefix=<your_preferred_directory>)

Редактировать: Относительно того, какой каталог наиболее подходит для конфигурации вашего приложения, кеширования данных и т. Д. Если вы используете linux, ознакомьтесь с Спецификацией базового каталога XDG .

8 голосов
/ 09 января 2012

tempfile.mkdtemp создаст для вас временный каталог и вернет его имя. Он будет создан в /tmp по умолчанию (в Unix-подобных системах), но «наиболее безопасным способом» и с разрешениями на чтение / запись / список только для идентификатора пользователя вызывающего абонента.

>>> d = tempfile.mktemp()
>>> with open(os.path.join(d, "secret")) as output:
...     output.write("Ha, you can't read this!")

(Кстати, в системе Unix / Linux с настройками по умолчанию пользователи не могут просто редактировать или удалять файлы друг друга из /tmp.)

2 голосов
/ 09 января 2012

Если это действительно временно, следуйте советам ларманов и используйте mkdtemp.

Если это какой-то полупостоянный кеш, который должен пережить перезагрузки, то вам следует использовать локальный каталог приложений, как определено вашей ОС (% APPDATA%, ~ / .local / etc);некоторые инструментарии (например, Qt) предоставляют функции для поиска этой папки кроссплатформенным способом.

Редактировать: из Википедии:

  • HOME (Unix-like) и USERPROFILE (MicrosoftWindows) - укажите, где в файловой системе находится домашний каталог пользователя.
  • HOME / {. AppName} (Unix-like) и APPDATA {DeveloperName \ AppName} (Microsoft Windows) - для хранения настроек приложения.Многие программы с открытым исходным кодом неправильно используют USERPROFILE для настроек приложения в Windows - USERPROFILE следует использовать только в диалоговых окнах, которые позволяют пользователю выбирать между путями, такими как Документы / Изображения / Загрузки / Музыка, для программных целей, использовать APPDATA (роуминг), LOCALAPPDATA илиPROGRAMDATA (для пользователей)

Таким образом, вам нужно поискать os.environ['APPDATA'] или os.environ['HOME'], в зависимости от платформы (см. sys.platform), а затем добавить имя вашего приложения, а затем выможете хранить там все, что захотите.

mydir = os.path.join( ".myAppName", "cache")
homeVar = 'HOME'  # default for all *nix variants
if sys.platform == 'win32': 
   homeVar = 'APPDATA'
mydir = os.path.join( os.environ[homeVar], mydir)
1 голос
/ 09 января 2012

http://pypi.python.org/pypi/appdirs - это модуль Python, который предлагает кроссплатформенную функцию user_cache_dir.

0 голосов
/ 09 января 2012

Только вот: вы можете захотеть взглянуть на git commit hooks . Таким образом, вместо наблюдения за каталогом tmp на предмет новых коммитов (звучит странно: кто будет комментировать в каталог tmp с ограниченными разрешениями), репо информирует вас о коммитах или, более конкретно, автоматически запускает скрипт при каждом коммите ..

0 голосов
/ 09 января 2012

Обычно программы используют каталог ~/.progname для хранения данных, которые должны быть постоянными, но должны оставаться "недоступными" для пользователя.

...