Python stdout从shell获取以前的1行以上
我使用这样的子进程从shell获取输出Python stdout从shell获取以前的1行以上,python,python-3.x,bash,shell,subprocess,Python,Python 3.x,Bash,Shell,Subprocess,我使用这样的子进程从shell获取输出 with subprocess.Popen(['bash', '-c', '. /root/myFile.sh;', ' func ' ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1,universal_newlines=True) as pro
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行加上当前行的方式获得输出。有什么方法可以干净地做到这一点吗?如果我理解问题的话:您必须记住一些列表中的前几行,并使用slice
[-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='')
顺便说一句:您可以使用变量轻松更改要显示的行数
[-count:][/code>
# before `for`-loop
count = 3
# inside `for`-loop
text = ''.join(previous_lines[-count:])
也许最干净的方法是使用一个新的方法
maxlen
参数是专门为您的用例设计的:
一旦有界长度deque已满,当添加新项时,从另一端丢弃相应数量的项。。。它们还可用于跟踪仅关注最新活动的事务和其他数据池
deque将比一个不断增加的列表,甚至是一个固定大小的列表更有效
因此:
要识别最后3行:首先,你必须把所有的行都放到某个列表中,然后将这个列表切片[-3:]
@furas难道不能像缓冲区这样做吗?不希望用户等待太久列表是一种buffer@furas那么增加buff size在这里没有帮助吗?缓冲区大小与此无关-stdout
(与for
一起使用)始终只给出一行,您必须自己记住某些列表中的这一行,并且仅显示此列表中的[-3:]。
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='')