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


Answers:


379

那将是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. 不得已时使用当前工作目录。

7
对我来说,OSX正在安装它,/var/folders/<garbage/here>而不是/tmp因为它是这样$TMPDIR设置的。看这里
里克·史密斯

3
目前,在Windows 10上使用python 3.6.5时,tempfile.gettempdir()解析为C:\users\user\AppData\Local\Temp。不幸的是,这条路很长。
解答

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%的人确定这就是您所需要的...。除非您想弄乱操作系统。
索林

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)

这类似于Google Chrome和Linux systemd这样的应用程序。他们只是使用较短的十六进制哈希值和特定于应用的前缀来“宣传”它们的存在。


1
您应该tempfile.mkdtemp()改用
nosklo,

@nosklo,这当然是一个选择,它将利用tempfile软件包中内置的所有强大功能,但是哈希方法使您可以创建选择的路径,并将多个目录嵌套在满足您要求的目录树中。它基本上是mkdtemp()您建议的更明确,更灵活的版本。
滚刀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.