【问题标题】:Use case for low-level os.open, os.fdopen, and friends?低级 os.open、os.fdopen 和朋友的用例?
【发布时间】:2012-12-26 03:59:26
【问题描述】:

在 Python 3.2(和其他版本)中,documentation for os.open 声明:

此函数适用于低级 I/O。对于正常使用,使用内置函数 open(),它返回一个带有 read() 和 write() 方法(以及更多)的文件对象。要将文件描述符包装在文件对象中,请使用 fdopen()。

还有for fdopen()

返回一个连接到文件描述符 fd 的打开文件对象。这是 open() 的别名并接受相同的参数。唯一的区别是 fdopen() 的第一个参数必须始终是整数。

This comment 在关于io.openos.open 之间区别的问题中(这个区别我完全清楚,我总是使用io.open,从不使用os.open)问: 为什么有人会选择 Python 进行低级 I/O?,但并没有真正得到答案。

我的问题与评论问题非常相似:在 Python 中,通过os.openos.fdopenos.closeos.read 等进行低级 I/O 的用例是什么.? 我曾经认为需要对进程进行去魔化,但I'm not so sure anymore。是否有任何任务只能使用低级 I/O 而不能使用高级包装器执行?

【问题讨论】:

  • 我的猜测是更高级别的包装器使用这些函数。至少tempfile 模块在 python 2.7.3 上使用了其中的大部分...
  • @mgilson 那么我的问题是,为什么 tempfile 不能使用更高级别的?

标签: python io low-level


【解决方案1】:

当我需要使用O_CREAT | O_EXCL 原子地创建文件时,我会使用它,如果文件存在则失败。如果您的测试发现文件不存在,则无法检查文件是否存在然后创建文件,因为这会产生竞争条件,在您检查和创建之间的过渡期间可以创建文件。

简单看一下the link you provided,我确实相信 pidfile 的创建有一个竞争条件。

在 Python 3.3 中,a new 'x' mode 添加到 open() 似乎可以做到这一点。不过我没试过。

【讨论】:

    【解决方案2】:

    主要区别:

    • 对文件的低级访问没有缓冲
    • 低级访问不可移植
    • 低级别允许更细粒度的控制,例如读取时是否阻塞

    低级 io 的用例:

    • 文件是块设备
    • 文件是一个套接字
    • 文件是 tty
    • ...

    在所有这些情况下,您可能希望拥有更细粒度的控制(过度缓冲和阻塞行为)。

    您可能永远不需要常规文件的低级函数。我认为大多数时候用例将是一些设备驱动程序的东西。但是,这最好在 C 中完成。但我也可以看到 python 的用例,例如用于设备驱动程序的快速原型设计。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多