【问题标题】:What is the OS-level handle of tempfile.mkstemp good for?tempfile.mkstemp 的操作系统级句柄有什么用?
【发布时间】:2020-03-25 15:35:24
【问题描述】:

当我需要在可能保留的目录中创建文件时,我使用tempfile.mkstemp,但我不关心文件名。它应该只是迄今为止不存在的东西,并且有前缀和后缀。

到目前为止我忽略的文档的一部分是

什么是操作系统级别的句柄,应该如何使用它?

背景

我一直是这样使用的:

from tempfile import mstemp

_, path = mkstemp(prefix=prefix, suffix=suffix, dir=dir)

with open(path, "w") as f:
    f.write(data)

# do something

os.remove(path)

到目前为止,它运行良好。然而,今天我写了一个小脚本,它会生成巨大的文件并删除它们。脚本中止执行并显示消息

OSError: [Errno 28] No space left on device

当我检查时,有 80 GB 可用空间。

我怀疑os.remove 只是“标记”了要删除的文件,但这些文件没有被正确删除。下一个怀疑是我可能需要在操作系统真正释放磁盘空间之前关闭操作系统级别的句柄。

【问题讨论】:

    标签: python-3.x temporary-files python-os


    【解决方案1】:

    你的怀疑是正确的。 os.remove 仅删除包含文件名的目录条目。但是,文件数据保持不变并继续占用磁盘空间,直到文件上的最后一个打开描述符关闭。在此期间,通过现有描述符对文件进行的正常操作将继续进行,这意味着您仍然可以在 os.remove 返回后使用 _ 描述符来查找、读取或写入文件。

    事实上,在继续使用描述符对文件内容进行操作之前,立即os.remove 文件是常见的做法。这可以防止文件被任何其他进程打开,并且还意味着如果该程序在到达以后的os.remove 之前意外死亡,文件不会被闲置。

    当然,只有当你愿意并且能够对文件的所有操作使用低级描述符时,这才有效,如果你使用os.fdopen 方法来构造一个描述符顶部的文件对象,并将该新对象用于所有操作。显然你只想做其中一件事;对同一个底层文件混合使用描述符访问和文件对象访问可能会产生意想不到的结果。

    os.fdopen(_) 的执行速度应该比open(path) 快,但它没有open 所具有的上下文管理器集成,因此它不能直接在with 构造中使用。我认为您可以使用contextlib.closing 来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2016-02-12
      • 2010-09-15
      • 2013-03-20
      相关资源
      最近更新 更多