低级os.open,os.fdopen和朋友的用例?

ger*_*rit 13 python io low-level

在Python 3.2(和其他版本)中,os.open文档说明:

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

对于fdopen() :

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

这个评论对之间的差异问题io.openos.open(此不同的是完全清楚对我来说,我一直使用io.open,从来没有os.open)问:为什么会有人选择Python低级别的I/O?,但没有真正得到答案.

我的问题是非常相似的带注释的问题:在Python中,什么是I/O通过低级别的使用情况下os.open,os.fdopen,os.close,os.read,等?我曾经认为需要对一个过程进行deamonise,但我不再那么肯定了.是否有任何任务只能使用低级I/O执行,而不能使用更高级别的包装器执行?

zig*_*igg 5

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

简要地看一下你提供的链接,我确实认为pidfile创建有竞争条件.

在Python 3.3中,添加了一个新'x'模式open()似乎就是这样做的.不过我还没试过.


ilm*_*acs 4

主要区别:

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

低级 io 的用例:

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

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

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