4

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

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 的输出并搜索短语,但是有很多输出,所以这种方式似乎效率很低。

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

4

2 回答 2

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']
于 2009-04-05T08:11:14.293 回答
1

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

于 2009-04-03T17:29:50.020 回答