我正在使用这样的子访问从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='')