如何从Python的连续过程中捕获输出?

时间:2018-08-22 03:16:52

标签: python

我是Python和Linux的新手。我有一个在终端窗口中运行的进程,它将无限期地运行。停止它的唯一方法是崩溃或我按下ctrl + C。该过程将文本输出到我希望使用Python捕获的终端窗口,因此我可以对该文本进行一些其他处理。

我知道我需要采取一些措施来获得stdout,但是无论我如何尝试,我似乎都无法正确捕获stdout。这是我到目前为止所拥有的。

import subprocess

command = 'echo this is a test. Does it come out as a single line?'

def myrun(cmd):
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    stdout = []
    while True:
        line = p.stdout.read()
        stdout.append(line)

        if line == '' and p.poll() != None:
                break
    return ''.join(stdout)

result = myrun(command)
print('> ' + result),

当我的命令是简单的“ echo blah blah blah”时,这将起作用。我猜这是因为回声过程终止了。如果我尝试运行Continuous命令,则永远不会捕获输出。这可能吗?

1 个答案:

答案 0 :(得分:2)

read()将阻塞阅读,直到达到EOF为止,请改为使用read(1024)readline()

  

read(size = -1)

     

读取并返回最大字节数。如果省略该参数,无或为负,则读取数据并返回直到达到EOF。

例如:

p = subprocess.Popen('yes', stdout=subprocess.PIPE)

while True:
    line = p.stdout.readline()
    print(line.strip())

有关python io doc的更多信息。