可能重复:
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.
您可以使用内置函数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()阅读子进程的输出.