【问题标题】:How do I print outputs from calls to subprocess.Popen(...) in a loop?如何在循环中打印对 subprocess.Popen(...) 的调用的输出?
【发布时间】:2010-10-17 10:11:31
【问题描述】:

我编写了一个脚本来运行具有不同输入参数的命令行程序并从输出中获取特定的行。我有以下循环运行:

p1 = subprocess.Popen(["program", args], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=False)
p2 = subprocess.Popen(["grep", phrase], stdin=p1.stdout, stdout=subprocess.PIPE, shell=False)
p1.wait()
p2.wait()
p = str(p2.stdout.readlines())
print 'p is ', p

一个问题是循环运行完成后只有输出。我想在每次进程完成时打印一些东西。我该怎么做?

另外,我想选择显示 p1 的输出。但是我不能在不破坏 p2 的情况下用 p1.stdout.readlines() 抓住它。我该怎么做?

我在想我不能调用 grep,存储 p1 的输出并搜索短语,但是输出很多,所以这种方式似乎效率很低。

任何建议将不胜感激。谢谢!

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    尝试在每个打印语句之后调用 sys.stdout.flush()。

    【讨论】:

    • 适用于我的主要问题。谢谢!
    【解决方案2】:

    这是一个在 Linux 上对我有用的快速 hack。根据您的要求,它可能对您有用。它使用tee 作为过滤器,如果您将print_all 传递给您的脚本,则会将一个额外的副本复制到/dev/tty(嘿,我说这是一个hack):

    #!/usr/bin/env python
    
    import subprocess
    import sys
    
    phrase = "bar"
    if len(sys.argv) > 1 and sys.argv[1] == 'print_all':
        tee_args = ['tee', '/dev/tty']
    else:
        tee_args = ['tee']
    
    p1 = subprocess.Popen(["./program"], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=False)
    p2 = subprocess.Popen(tee_args, stdin=p1.stdout, stdout=subprocess.PIPE, shell=False)
    p3 = subprocess.Popen(["grep", phrase], stdin=p2.stdout, stdout=subprocess.PIPE, shell=False)
    p1.wait()
    p2.wait()
    p3.wait()
    p = str(p3.stdout.readlines())
    print 'p is ', p
    

    program的内容如下:

    #!/bin/sh
    
    echo foo
    echo bar
    echo baz
    

    示例输出:

    $ ./foo13.py p 是 ['bar\n'] $ ./foo13.py print_all 富 酒吧 巴兹 p 是 ['bar\n']

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2018-02-23
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2021-03-24
      相关资源
      最近更新 更多