【发布时间】:2012-04-18 05:21:15
【问题描述】:
我一直认为在 Python 中迭代类文件相当于在循环中调用它的 readline 方法,但今天我发现了一种情况并非如此。具体来说,我有一个Popen'd 进程p where
list(itertools.takewhile(lambda x: x != "\n",
p.stdout))
挂起(可能是因为 p 等待输入;stdin 和 stdout 都是我的 Python 进程的管道),而以下工作:
list(itertools.takewhile(lambda x: x != "\n",
iter(p.stdout.readline, "")))
有人能解释一下区别吗?
【问题讨论】:
-
旁注:你可以用
iter(f.readline, None)代替fiter(),甚至用iter(f.readline, "\n")代替takewhile()。 -
您看到的问题与缓冲有关:
file.__iter__()在某种程度上比file.readline()更积极地缓冲——这也是您不能混合它们的原因。目前懒得研究细节并把它变成答案…… -
@SvenMarnach:你的意思是
iter(f.readline, ""),但是是的,谢谢,我一直忘记这个:) -
我用
None模拟while True。 -
很高兴看到你毕竟是人类,而且什么都不知道:-)
标签: python io iterator subprocess pipe