stdout从shell获取前面超过1行的内容



我正在使用这样的子访问从shell获取输出。

with subprocess.Popen(['bash', '-c', '. /root/myFile.sh;',
' func ' ], stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
bufsize=1,universal_newlines=True) as proc_launch:
for line in proc_launch.stdout:
print(line, end='')

它是一行一行地输出,而我想以一种类似于最后3或4行加上当前行的方式获得输出。有什么干净的方法吗?

如果我理解问题:您必须记住某个列表中的前几行,并使用切片[-3:]来显示该列表中的最后3行。

previous_lines = list()
for line in proc_launch.stdout:
#remeber previous lines
previous_lines.append(line)
# get last 3 lines with current
text = ''.join(previous_lines[-3:])
# display it
print(text, end='')

BTW:您可以使用变量轻松更改显示[-count:]的行数

# before `for`-loop
count = 3
# inside `for`-loop
text = ''.join(previous_lines[-count:])

可能最干净的方法是使用collections.deque

maxlen参数是专门为您的用例设计的:

一旦一个有界长度的deque满了,当添加新项目时,就会从另一端丢弃相应数量的项目。。。它们还可用于跟踪仅对最近的活动感兴趣的事务和其他数据池。

一个deque将比一个不断增加的列表,甚至一个固定大小的列表更有效率。

因此:

from collections import deque
last_lines = deque(4)
with subprocess.Popen(...) as proc_launch:
for line in proc_launch.stdout:
last_lines.append(line)
print(''.join(last_lines), end='')

相关内容

  • 没有找到相关文章

最新更新