从 python 文档开始urllib.urlopen()
,讨论函数成功返回的类文件对象:
(但是,它不是内置文件对象,因此不能在需要真正内置文件对象的少数地方使用。)
哪些地方需要真正的内置文件对象?
注意:这纯粹是出于好奇……这里没有要解决的实际问题。
从 python 文档开始urllib.urlopen()
,讨论函数成功返回的类文件对象:
(但是,它不是内置文件对象,因此不能在需要真正内置文件对象的少数地方使用。)
哪些地方需要真正的内置文件对象?
注意:这纯粹是出于好奇……这里没有要解决的实际问题。
正如其他答案所指出的那样,实际上并没有任何地方特别需要file
对象,但是有些接口需要真正的操作系统级文件描述符,而类似文件的对象StringIO
无法提供这些接口。
该os
模块有几个直接对文件描述符进行操作的方法,如select
和mmap
模块。一些更高级别的模块依赖于底层模块,因此在处理不支持该fileno()
方法的类文件对象时可能会出现一些限制。
不过,我不知道这些限制的任何一致文档(除了接受数字文件描述符而不是对象的明显 API 之一)。更多的是“尝试一下,看看它是否有效”。如果事情不起作用,那么这就是你要记住的事情,以检查是否可能是罪魁祸首(特别是如果短语喜欢"no attribute named 'fileno'"
或"invalid file descriptor"
出现在任何相关的错误消息中)。
模块中的东西subprocess
需要一个具有fileno
可调用属性的文件对象stdin
,stdout
和stderr
,只有具有文件描述符的文件(真实文件)才应该实现。isatty()
也应该只在真实文件中实现,但我不知道它在哪里需要。
例如,f.fileno() 不一定会返回可以与 os.read() 一起使用的真正的操作系统级文件描述符。