Python中获取临时目录的跨平台方法

372

在Python 2.6中,是否有一种跨平台的方法获取temp目录的路径?

例如,在Linux下是/tmp,而在XP下是C:\Documents and settings\[user]\Application settings\Temp


不是Python专家,但你应该使用这些方法来创建临时文件/目录。 - skrat
1
请访问http://docs.python.org/library/tempfile.html查看tempfile模块。 - Jordan Parmer
5个回答

524
那将是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:\TEMPC:\TMP\TEMP\TMP。 - 在其他所有平台上,按照顺序为/tmp/var/tmp/usr/tmp。 5. 作为最后的选择,使用当前工作目录。

14
因为 $TMPDIR 被设置成这样,所以对我来说,OSX 把它放在 /var/folders/<garbage/here> 而不是 /tmp 中。请参见这里 - Rick Smith
6
目前,在Windows 10上使用Python 3.6.5,tempfile.gettempdir()的返回值为C:\users\user\AppData\Local\Temp,这是一个比较长的路径。 - solvingJ
@solvingJ: 我觉得这与Python无关。哪个临时文件夹会更短呢? - undefined

93

这个应该可以满足你的需求:

print(tempfile.gettempdir())

对于我在我的Windows电脑上,我得到:

c:\temp

而在我的Linux机器上,我得到:

/tmp

但这对MacOS不起作用... Asclepius的答案是对于MacOS更好的选择。 - John MC
1
@JohnMC 它适用于MacOS,尽管MacOS报告的路径比其他平台更长,不太容易记忆。 - Bede Constantinides

30

我使用:

from pathlib import Path
import platform
import tempfile

tempdir = Path("/tmp" if platform.system() == "Darwin" else tempfile.gettempdir())

这是因为在MacOS上,即Darwin系统中,tempfile.gettempdir()os.getenv('TMPDIR')返回的值通常为'/var/folders/nj/269977hs0_96bttwj2gs_jhhp48z54/T',但我并不总是需要这个值。


3
至少在这种情况下,MacOS会做正确的事情,返回一个用户级别隔离的临时目录。我99.99%确定这就是你需要的...除非你想搞乱操作系统。 - sorin
3
@sorin 99.99%是有点夸张了,我认为50%更现实。通常我正在使用多进程,然后我可能希望所有进程都使用相同的临时目录。 - Asclepius
@Acumenus,据我所知,Sorin是正确的。你认为OSX上每个进程的TMPDIR都不同的假设是错误的。TMPDIR是每个用户但每个会话的。这个位置在重启时被清理掉。如果你想让自己相信,请尝试一个Python代码,显示TMPDIR并将其保存到testTempdir.py中,然后在终端中执行以下操作for ((i=0;i<20;i++)) do;./testTempDir.py&;echo $!;done。你会看到20个不同的进程ID和相同的TMPDIR。 - Stephane Gasparini
@StephaneGasparini 是否有文档说明在 MacOS 上 TMPDIR 是每个用户独立的? - Asclepius
2
@Asclepius TMPDIR是一个环境变量,据我所知,它表示NSTemporaryDirectory的结果。API文档称其为每个用户的临时目录,请参见https://developer.apple.com/documentation/foundation/1409211-nstemporarydirectory。另请参见https://dev59.com/VGPVa4cB1Zd3GeqP2A1L。 - Stephane Gasparini
显示剩余4条评论

26

根据 @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 所做的事情。它们只使用较短的十六进制哈希和特定于应用程序的前缀来“公开”它们的存在。


2
你应该使用 tempfile.mkdtemp() - nosklo
@nosklo,这肯定是一个选择,并将利用tempfile包中构建的所有鲁棒性,但哈希方法使您可以创建自己选择的路径并嵌套多个目录在满足您要求的目录树中。它基本上是一个更明确、更灵活的mkdtemp()版本。 - hobs

-6
为什么回答这么复杂?
我只是用这个。
   (os.getenv("TEMP") if os.name=="nt" else "/tmp") + os.path.sep + "tempfilename.tmp"

3
这个答案为什么比其他答案更简单? - Crispy Holiday
@CrispyHoliday 这只是一个玩笑,他们在开玩笑。 - Benjamin Goodacre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接