5

从 python 文档开始urllib.urlopen(),讨论函数成功返回的类文件对象:

(但是,它不是内置文件对象,因此不能在需要真正内置文件对象的少数地方使用。)

哪些地方需要真正的内置文件对象?

注意:这纯粹是出于好奇……这里没有要解决的实际问题。

4

3 回答 3

3

正如其他答案所指出的那样,实际上并没有任何地方特别需要file对象,但是有些接口需要真正的操作系统级文件描述符,而类似文件的对象StringIO无法提供这些接口。

os模块有几个直接对文件描述符进行操作的方法,如selectmmap模块。一些更高级别的模块依赖于底层模块,因此在处理不支持该fileno()方法的类文件对象时可能会出现一些限制。

不过,我不知道这些限制的任何一致文档(除了接受数字文件描述符而不是对象的明显 API 之一)。更多的是“尝试一下,看看它是否有效”。如果事情不起作用,那么这就是你要记住的事情,以检查是否可能是罪魁祸首(特别是如果短语喜欢"no attribute named 'fileno'""invalid file descriptor"出现在任何相关的错误消息中)。

于 2011-05-16T11:56:13.690 回答
2

模块中的东西subprocess需要一个具有fileno可调用属性的文件对象stdin,stdoutstderr只有具有文件描述符的文件(真实文件)才应该实现isatty()也应该只在真实文件中实现,但我不知道它在哪里需要。

于 2011-05-16T00:17:08.523 回答
0

例如,f.fileno() 不一定会返回可以与 os.read() 一起使用的真正的操作系统级文件描述符。

于 2011-05-16T00:13:33.657 回答