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

dgr*_*ant 2 python

可能重复:
Python While循环中的赋值条件

什么相当于:

while (line = p.stdout.readline()) != '':
    ...
Run Code Online (Sandbox Code Playgroud)

在Python?

我不喜欢这样做:

line = p.stdout.readline()
while line != '':
    sys.stdout.write(line)
    line = p.stdout.readline()
Run Code Online (Sandbox Code Playgroud)

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

for line in p.stdout:
    sys.stdout.write(line)
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它没有,open()例如从返回的句柄.

编辑:对不起,我错了,它确实支持它,问题是我无法立刻把它拿出来,就像我可以p.stdout.readline().添加sys.stdout.flush()似乎没有帮助,所以它必须在内部缓冲p.stdout.

And*_*ark 9

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

for line in iter(p.stdout.readline, ''):
    ...
Run Code Online (Sandbox Code Playgroud)

这方面的文件:

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)
Run Code Online (Sandbox Code Playgroud)

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