从subprocess.check_call重定向stdout到函数?

时间:2011-03-30 14:45:30

标签: python redirect callback stdout

调用subprocess.check_call()允许为stdout指定文件对象,但在将数据写入文件之前,我想在逐行基础上修改它们。

我目前将输出重定向到临时文件(由tempfile.TemporaryFile()创建。check_call完成后,我逐行读取该临时文件,进行修改并编写最终输出文件。

由于输出很大,纯粹的内存解决方案是不可行的,我想在运行中修改数据并直接写入最终输出文件。

有谁知道如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

def check_call_modify(command, modifier_function, output_file)
    p = subprocess.Popen(command, stdout=subprocess.PIPE)
    for line in p.stdout:
        line = modifier_function(line)
        output_file.write(line)    
    p.wait()
    if p.returncode:
        raise subprocess.CalledProcessError(p.returncode, command)
    return p.returncode

使用它传递一个函数来修改每一行和文件。下面的愚蠢示例会将ls -l的结果以大写字母保存到listupper.txt

with open('listupper.txt', 'w') as f:
    check_call_modify(['ls', '-l'], operator.methodcaller('upper'), f)

答案 1 :(得分:-1)

Python是鸭子类型,因此您可以在将文件对象传递给check_call之前始终将其包装起来。

这个答案有一个doing it for write()的例子,但为了彻底,你可能还想包裹writelines()