Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python stdout从shell获取以前的1行以上_Python_Python 3.x_Bash_Shell_Subprocess - Fatal编程技术网

Python stdout从shell获取以前的1行以上

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

我使用这样的子进程从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行加上当前行的方式获得输出。有什么方法可以干净地做到这一点吗?

如果我理解问题的话:您必须记住一些列表中的前几行,并使用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='')