我写要运行的脚本不同的输入参数的命令行程序和抓住从输出一定的线。我有以下在循环执行:

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的输出的选择。但我不能用p1.stdout.readlines()不破坏P2抓住它。我怎样才能做到这一点?

我在想,我可以不打这个电话给grep,存储P1的输出和搜索短语,但有大量的输出,所以这种方式似乎非常低效。

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

有帮助吗?

解决方案

这里有一个快速劈为我工作在Linux上。它可能为你工作,根据您的要求。它采用三通为,如果传递print_all到您的过滤器脚本,将重复的额外拷贝到的/ dev / tty的(哎,我说是一个劈):

#!/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 is  ['bar\n']
$ ./foo13.py print_all
foo
bar
baz
p is  ['bar\n']

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top