13

在 Python 3.2(和其他版本)中,os.open 的文档指出:

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

对于 fdopen( ) :

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

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

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

4

2 回答 2

5

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

简要查看您提供的链接,我相信 pidfile 创建有一个竞争条件。

在 Python 3.3 中,添加了一个新'x'模式open()似乎可以做到这一点。不过,我还没有尝试过。

于 2013-01-11T15:11:44.027 回答
4

主要区别:

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

低级 io 的用例:

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

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

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

于 2013-01-11T15:50:23.517 回答