【问题标题】:stdout get previous more than 1 lines from shellstdout 从 shell 获取前多于 1 行
【发布时间】:2021-03-19 19:02:42
【问题描述】:

我正在使用这样的子进程从 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:]
  • @furas 不能像缓冲区等那样完成吗?不希望用户等待太久
  • 列表是某种缓冲区
  • @furas 然后增加buff大小在这里没有帮助吗?
  • 缓冲区大小与此无关 - stdout(与 for 一起使用)总是只给出一行,您必须自己在某些列表中记住这一行并仅显示 [- 3:] 从这个列表中。

标签: python python-3.x bash shell subprocess


【解决方案1】:

如果我理解问题:您必须记住某个列表中的前几行并使用 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:]

# before `for`-loop

count = 3

# inside `for`-loop

text = ''.join(previous_lines[-count:])

【讨论】:

    【解决方案2】:

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

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

    一旦有界长度的双端队列已满,当添加新项目时,相应数量的项目将从另一端丢弃。 ...它们对于跟踪仅关注最近活动的交易和其他数据池也很有用。

    双端队列将比不断增加的列表甚至固定大小的列表更有效。

    所以:

    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='')
    

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2023-03-05
      • 2021-12-29
      相关资源
      最近更新 更多