从subprocess.popen获取总行数
考虑以下示例:
P1 = subprocess.Popen(stdout=subprocess.PIPE, stderr=subprocess.PIPE)
P1.stdout.readLines()
在上面的例子中,能不能统计从 p1 输出的行数呢?因为我可以通过 p1.stdout.readLines() 一行一行地读取,
但这不是我想要的,我需要的是总的行数作为输出……这种情况可以实现吗?
1 个回答
3
没错!你可以使用 len()
,比如:
lines = P1.stdout.readLines()
no_of_lines = len(lines)
或者你也可以简单地这样做:
>>> from subprocess import Popen, PIPE
>>> p = Popen(["ls", "-1", "/usr/local/bin"], stdout=PIPE)
>>> sum(1 for _ in p.stdout)
493
这个方法和 len()
有点不同,因为它会消耗一个生成器表达式并把它们加起来。也就是说:给我每一行 p1.stdout 中 1 的总和。
在 Python 中,很多可以被循环的对象也支持 len()
这个函数。
- 列表(list)
- 字典(dict)
- 集合(set)
- 字符串(unicode/str/bytes)
这些对象都实现了 __len__
,而 len()
就是用这个来计算长度的。
这被称为 鸭子类型,是 Python 中最有用的类型处理方式之一!