8

我需要一个临时目录,但我想完全控制它的创建和删除。

我将使用这个目录来放置我想要监视新提交的 git 存储库,因此我需要将它们永久存储在某个地方。

因此我想避免/tmpdir,因为它可以被用户(?)清除。对此的最佳做法是什么?

4

6 回答 6

8

tempfile.mkdtemp将为您创建一个临时目录并返回其名称。它将/tmp默认创建它(在类 Unix 系统上),但“以最安全的方式”并且仅对调用者的用户 ID 具有读/写/列表权限。

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

(顺便说一句,在具有默认设置的 Unix/Linux 系统上,用户不能只编辑或删除彼此的文件/tmp。)

于 2012-01-09T13:32:07.507 回答
8

我想说最好的做法是使用tempfile.mkdtemp.

如果你不想使用/tmpthen,你可以利用这个prefix参数:

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

编辑:关于什么是最适合您的应用程序配置、缓存数据等的目录。如果您使用的是 linux,请查看XDG Base Directory Specification

于 2012-01-09T13:32:27.690 回答
2

如果它真的是暂时的,请遵循 larmans 的建议并使用mkdtemp.

如果它是某种必须在重启后仍然存在的半永久缓存,那么您应该使用由您的操作系统定义的本地应用程序目录(%APPDATA%、~/.local/ 等);一些工具包(例如 Qt)提供了以跨平台方式查找该文件夹的功能。

编辑:来自维基百科:

  • HOME(类 Unix)和 USERPROFILE(Microsoft Windows) - 指示用户的主目录在文件系统中的位置。
  • HOME/{.AppName} (类 Unix) 和 APPDATA{DeveloperName\AppName} (Microsoft Windows) - 用于存储应用程序设置。许多开源程序错误地将 USERPROFILE 用于 Windows 中的应用程序设置 - USERPROFILE 只能用于允许用户在文档/图片/下载/音乐等路径之间进行选择的对话框中, 出于编程目的使用 APPDATA(漫游)、LOCALAPPDATA 或 PROGRAMDATA(共享用户之间)

因此,您应该查找os.environ['APPDATA']or 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)
于 2012-01-09T13:40:37.483 回答
0

通常程序使用一个~/.progname目录来存储应该是持久的但应该“远离”用户的数据。

于 2012-01-09T13:40:21.257 回答
0

只是:您可能想查看 git commit hooks。这样,repo 不会监视 tmp 目录中的新提交(听起来很奇怪:谁会以有限的权限提交到 tmp 目录?),repo 会通知您有关提交,或者更具体地说,每当提交发生时自动运行脚本。

于 2012-01-09T13:52:47.893 回答
0

http://pypi.python.org/pypi/appdirs是一个提供跨平台user_cache_dir功能的 Python 模块。

于 2012-01-09T16:48:47.313 回答