【问题标题】:Cross-platform way of getting temp directory in Python在 Python 中获取临时目录的跨平台方法
【发布时间】:2010-10-25 06:34:03
【问题描述】:

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

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

【问题讨论】:

标签: python cross-platform temporary-directory


【解决方案1】:

那就是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. 作为最后的手段,当前工作目录。

【讨论】:

  • 对我来说,OSX 将它放入 /var/folders/<garbage/here> 而不是 /tmp 因为这是设置 $TMPDIR 的方式。见here
  • 目前,在 Windows 10 上使用 python 3.6.5,tempfile.gettempdir() 解析为 C:\users\user\AppData\Local\Temp。不幸的是,这条路很长。
【解决方案2】:

这应该做你想做的:

print tempfile.gettempdir()

在我的 Windows 机器上,我得到:

c:\temp

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

/tmp

【讨论】:

  • 但这不适用于 MacOS...Asclepius 的答案是 MacOS 更好的选择
【解决方案3】:

我用:

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';这是我并不总是想要的。

【讨论】:

  • 至少在这种情况下,MacOS 做了正确的事情,即返回一个用户级隔离的临时目录。我 99.99% 确定这是您需要的……除非您想弄乱操作系统。
  • @sorin 99.99% 有点牵强。我会说50%更现实。我经常使用多处理,然后我可能希望所有进程都使用相同的临时目录。
  • @Acumenus 确实据我所知索林是对的。您认为 osx 上的 TMPDIR 对于每个进程都会有所不同的假设是错误的。 TMPDIR 是每个用户但每个会话。此位置在重新启动时被清除。如果您想说服自己尝试显示 TMPDIR 并将其保存到 testTempdir.py 的 python 代码,然后在您的终端 for ((i=0;i<20;i++)) do;./testTempDir.py&;echo $!;done 中执行此操作。你会看到 20 ≠ 进程 id 和 20 次相同的 TMPDIR
  • @StephaneGasparini,是的,但有时您需要来自不同父级(会话)的单独进程,这更加跨平台
  • TMPDIR 是每个用户的,所以我不确定我明白你的意思
【解决方案4】:

最简单的方法,基于@nosklo 的评论和answer

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 等应用程序所做的事情。他们只是使用较短的十六进制哈希和特定于应用的前缀来“宣传”他们的存在。

【讨论】:

  • 你应该改用tempfile.mkdtemp()
  • @nosklo,这当然是一个选项,并且可以利用 tempfile 包中内置的所有稳健性,但是哈希方法允许您创建您选择的路径并将多个目录嵌套在目录树中满足您的要求。它基本上是您建议的mkdtemp() 的更明确、更灵活的版本。
【解决方案5】:

为什么会有这么多复杂的答案?

我只是用这个

   (os.getenv("TEMP") if os.name=="nt" else "/tmp") + os.path.sep + "tempfilename.tmp"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2011-07-31
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多