相当于这个:
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
内进行缓冲。
答案 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()
来读取子进程的输出。