低级别的os.open、os.fdopen等函数有什么使用场景?

13
在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中,通过os.openos.fdopenos.closeos.read等进行低级I/O的用例是什么?我曾经认为需要将进程变成守护进程,但我现在不太确定了。是否有任何任务只能使用低级I/O来完成,而不能使用更高级别的包装器?


我的猜测是更高级别的封装会使用这些函数。至少在Python 2.7.3中,tempfile模块大多数情况下都会使用它们... - mgilson
@mgilson 那我的问题是,为什么tempfile不能使用更高级别的函数? - gerrit
2个回答

5

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

简要查看您提供的链接,我确实认为pidfile创建存在竞争条件。

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


4

主要区别:

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

低级I/O的用例:

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

在所有这些情况下,您可能希望具有更精细的控制(缓冲和阻止行为)。

通常情况下,您不需要对普通文件进行低级功能操作。我认为大多数情况下,用例将是一些设备驱动程序。但是,最好使用C来完成此操作。但我也可以看到python的用例,例如用于设备驱动程序的快速原型设计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接