【问题标题】:How can I capture the stdout output of a child process?如何捕获子进程的标准输出输出?
【发布时间】:2010-10-29 17:08:31
【问题描述】:

我正在尝试用 Python 编写一个程序,但我被告知要运行一个 .exe 文件。当这个 .exe 文件运行时,它会吐出大量数据,我需要将某一行打印到屏幕上。我很确定我需要使用 subprocess.popen 或类似的东西,但我是 subprocess 新手并且不知道。任何人都有一个简单的方法让我完成这项工作?

【问题讨论】:

    标签: python subprocess stdout


    【解决方案1】:

    类似这样的:

    import subprocess
    process = subprocess.Popen(["yourcommand"], stdout=subprocess.PIPE)
    result = process.communicate()[0]
    

    【讨论】:

    • 如何读出某一行?那是0在哪里?是的,我有兴趣在流程完成后打印输出。还有你有“你的命令”的地方有 exe 扩展名吗?
    • "result" 将是 "yourcommand" 的全部输出。然后,您可以处理该字符串(或字节对象,在 Py3.0 中)以找到您要查找的行。
    • [0] 表示返回的元组的第一个元素(stdout、stderr);您可以根据自己的喜好处理结果,这将是一个字符串,例如找到特定的行。 "yourcommand" 是你的完整命令,如果命令不在在路径上(至少在 *nix 上),则最终是命令的完整路径。
    【解决方案2】:

    如果您有兴趣在流程完成执行后打印输出,@Paolo 的解决方案是完美的。如果您想在进程运行时轮询输出,您必须这样做:

    process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    
    while True:
        out = process.stdout.readline(1)
        if out == '' and process.poll() != None:
            break
        if out.startswith('myline'):
            sys.stdout.write(out)
            sys.stdout.flush()
    

    【讨论】:

    • 这里的myline 是什么?
    • OP 说 “我需要将某行打印到屏幕上”,myline 只是一个例子。代码的那部分是识别要打印的特定输出行的地方。
    猜你喜欢
    • 2012-09-17
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多