从subprocess.popen获取总行数

3 投票
1 回答
4691 浏览
提问于 2025-04-18 06:30

考虑以下示例:

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 中最有用的类型处理方式之一!

撰写回答