2013-02-23 72 views
24

我真的很困惑时使用os.open以及何时使用os.fdopen是什么蟒蛇

我在做我所有的工作与os.open和它的工作没有任何问题,但我os.open和os.fdopen之间的区别我不能够,我们需要file descriptors什么样的条件和所有其他功能,如dupfsync

下,要明白的是从file descriptor

file object不同我的意思是f = os.open("file.txt",w)

现在是f fileobject或它的filedescriptor?

+0

根据[该文档](HTTP: //docs.python.org/2/library/os.html#os.open),os.open()返回一个文件描述符,而内建的open()返回一个文件对象。 – Octipi 2013-02-23 10:40:31

回答

41

您正在混淆os模块提供的内置open()函数和os.open()。他们完全不同; os.open(filename, "w")是无效的Python(os.open接受整数标志作为其第二个参数),open(filename, "w")是。

总之,open()创建新的文件对象,os.open()创建操作系统级文件描述符,并os.fdopen()创建文件对象出文件描述符。

文件描述符是用于处理由操作系统内核直接提供的文件的底层工具。文件描述符是一个小整数,用于标识内核为每个进程保存的打开文件表中的打开文件。许多系统调用接受文件描述符,但它们不便于使用,通常需要固定宽度的缓冲区,在某些条件下多次重试,以及手动错误处理。

文件对象是Python类,它包装文件描述符以使文件更容易处理且不易出错。例如,它们提供了错误处理,缓冲,逐行读取,字符集转换,并在收集垃圾时关闭。

概括地说:

  • 内置open()的一个文件名,并返回一个新的Python文件对象。这是你在大多数情况下需要的。

  • os.open()取一个文件名并返回一个新的文件描述符。该文件描述符可以传递给其他低级函数,如os.read()os.write()os.fdopen(),如下所述。编写依赖于与操作系统相关的API的代码时,您只需要使用该代码,例如使用O_EXCL标志至open(2)

  • os.fdopen()采用现有的文件描述符 - 通常由UNIX系统调用如pipe()dup()生产的,并建立它周围Python文件对象。它有效地将文件描述符转换为完整的文件对象,当与C代码或只创建低级别文件描述符的API进行交互时,该文件对象很有用。

内置open可使用os.open()(创建一个文件描述符)来实现,并且os.fdopen()(将其包装在一个文件对象):

# equivalent to open(filename, "r") 
f = os.fdopen(os.open(filename, os.O_RDONLY)) 
+0

你说的对,我和'open'和'os.open()'混淆了。你可以给我一些代码示例,我可以使用'fd'来做一些普通的'open'不可能的事情。我想知道它是如何工作的 – user1994660 2013-02-23 10:53:50

+0

@ user1994660正如我在答案中所说的,您不能将'O_EXCL'或其他系统特定的标志传递给内建open()。至于'os.fdopen()',诸如'pipe()','dup()'等的Unix API都返回文件描述符,而不是文件对象。在这种情况下,您可以使用'os.fdopen'将这些描述符转换为文件对象。 – user4815162342 2013-02-23 11:00:38