【问题标题】:Read console output of another program in Python在 Python 中读取另一个程序的控制台输出
【发布时间】:2016-01-12 22:15:09
【问题描述】:

有两个程序 - parent.py 和 myscript.py,如下所示。 parent.py 不断在控制台中打印消息。 myscript.py 需要访问 parent.py 打印的内容。

parent.py:

import time

while 1:
     time.sleep(1)
     print "test"

myscript.py:

import subprocess
p = None

p = subprocess.Popen(['python', 'parent.py'],
                 stdout=subprocess.PIPE,
                 stderr=subprocess.STDOUT,
                 )
for line in p.stdout:
       print line

我希望 myscript.py 动态捕获 parent.py 的输出。可以看出,parent.py 有一个无限循环——脚本永远不会停止,但每当它输出单词“test”时,myscript.py 也应该输出相同的内容。但是 myscript.py 没有给出任何输出。

我尝试用 just 替换 parent.py 中的代码

print "Hello"

由于程序执行完毕,myscript.py 也打印了“Hello”。所以我猜除非 parent.py 的执行完成,否则 myscript.py 不会读取它。是这样吗?

我还尝试用这个 sn-p 替换 myscript.py 中的循环:

for line in iter(p.stdout.readline, ''):
    print line

仍然没有输出。

我的问题是:我如何让 myscript.py 动态读取 parent.py 正在打印的所有内容,即使 parent.py 永远不会完成其执行。

(我发现了类似的问题,但它们要么不起作用,要么根本没有答案。)

【问题讨论】:

    标签: python python-2.7 subprocess stdout


    【解决方案1】:

    这是一个block buffering issue:当标准输出被重定向到管道时,parent.py 将其输出累积在一个内部缓冲区 (~4K-8K) 中,也就是说,在缓冲区溢出之前大约一个小时你不会看到任何东西。

    要禁用缓冲,请传递-u 命令行选项:

    #!/usr/bin/env python
    import os
    import sys
    from subprocess import Popen, PIPE, STDOUT
    
    script_path = os.path.join(get_script_dir(), 'parent.py')
    p = Popen([sys.executable, '-u', script_path],
              stdout=PIPE, stderr=STDOUT, bufsize=1)
    with p.stdout:
        for line in iter(p.stdout.readline, b''):
            print line,
    p.wait()
    

    见:

    注意:如果您不需要对输出做任何事情,那么只需删除stdout=PIPE,即可在控制台中查看输出:

    subprocess.check_call([sys.executable, script_path])
    

    【讨论】:

    • 有效!另外,一个快速的问题(不确定它是快速解决方法还是涉及更复杂的方法):是否可以通过正在运行的程序实现相同的目标?我的意思是,在这种情况下 - myscript.py 执行 parent.py 然后将输出返回给 myscript。我正在寻找已经在运行并提取其输出的代码的控制台输出。就像识别进程 > 获取进程 ID > 从控制台获取输出。我应该将此作为一个单独的问题提出还是我可以调整此脚本本身?
    • @Krish:“已经在运行”的案例(尤其是如果您无法控制流程的启动方式)是一个单独的问题:确保提供上下文和动机:您要解决什么问题解决以及为什么您认为拦截输出会有所帮助。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多