Python相当于条件中的C类赋值

时间:2012-02-09 19:08:54

标签: python

  

可能重复:
  Assignment Condition in Python While Loop

相当于这个:

while (line = p.stdout.readline()) != '':
    ...
在Python中

我不喜欢这样做:

line = p.stdout.readline()
while line != '':
    sys.stdout.write(line)
    line = p.stdout.readline()

虽然我多年来一直在使用后者......我怀疑别无选择。我认为p.stdout支持迭代,比如

for line in p.stdout:
    sys.stdout.write(line)

但不幸的是,它与open()返回的句柄不同。

编辑抱歉,我错了,它确实支持它,问题是我无法像p.stdout.readline()一样立即解决问题。添加sys.stdout.flush()似乎没有帮助,因此必须在p.stdout内进行缓冲。

1 个答案:

答案 0 :(得分:9)

您可以使用内置函数iter()使用双参数调用方法完成此操作:

for line in iter(p.stdout.readline, ''):
    ...

此文档:

  

iter(o[, sentinel])
  ...
  如果给出第二个参数 sentinel ,则 o 必须是可调用对象。在这种情况下创建的迭代器将调用 o ,每次调用next()方法时都不带参数;如果返回的值等于 sentinel ,则会引发StopIteration,否则将返回该值。

     

第二种形式的iter()的一个有用的应用是读取文件的行直到达到某一行。以下示例读取文件,直到readline()方法返回空字符串:

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

编辑:根据您的编辑,您的实际问题与缓冲相关。根据上下文,我猜您正在使用subprocess.Popen() stdout=subprocess.PIPE。而不是直接使用文件句柄p.stdout,您应该p.communicate()来读取子进程的输出。