如何使用 iter() 和 yield 遍历两个列表?

Posted

技术标签:

【中文标题】如何使用 iter() 和 yield 遍历两个列表?【英文标题】:How to iterate through two lists with iter() and yield? 【发布时间】:2018-07-16 21:47:44 【问题描述】:

一个简单的例子:

 popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True)
 for stdout_line in iter(popen.stdout.readline, ""): # how to add popen.stderr.readline check?
     yield stdout_line

我们从popen.stdout 读取,但我们也想同时从stderr 读取!我们不知道进程何时结束。

那么如何用 iter() 和 yield 遍历两个列表呢?

【问题讨论】:

您可能需要在流上使用 read() 并进行自己的缓冲和 EOF 检测。 嗯...你想读取 stdout 【参考方案1】:

这些不是列表,使用它们的正确方法不是使用列表的方式。如果您想将进程的 stdout 和 stderr 填充到一个组合流中,请使用输出重定向:

from subprocess import PIPE, STDOUT

process = subprocess.Popen(cmd, stdout=PIPE, stderr=STDOUT, ...)
#                                                   ^^^^^^

【讨论】:

这将适用于我在这里的特定示例,但是否有概括? @DuckQueen:取决于您想将其概括为什么(在您询问之前,将其概括为列表没有意义)。我建议先对列表和流进行一些背景阅读,然后在结束时发布一个新问题,如果你还有什么要问的。

以上是关于如何使用 iter() 和 yield 遍历两个列表?的主要内容,如果未能解决你的问题,请参考以下文章

python-迭代器(next(),iter()函数)和生成器(yield函数)

python-迭代器(next(),iter()函数)和生成器(yield函数)

在 Python 2.7.1 中使用 itertools、yield 和 iter() 生成带有滑动窗口的字符串列表?

python--yield生成器和return对比

迭代器与生成器yield

yield表达式形式