Python 是否将stdout从subprocess.check\u调用重定向到函数?

Python 是否将stdout从subprocess.check\u调用重定向到函数?,python,redirect,callback,stdout,Python,Redirect,Callback,Stdout,调用subprocess.check_call()允许为标准输出指定文件对象,但在将数据写入文件之前,我希望逐行修改它们 我当前将输出重定向到一个临时文件(由tempfile.TemporaryFile()创建)。在check\u call完成后,我逐行读取该临时文件,进行修改并写入最终的输出文件 由于输出很大,纯内存解决方案是不可行的,我想动态修改数据并直接写入最终的输出文件 有人知道如何做到这一点吗 def check_call_modify(command, modifier_functi

调用
subprocess.check_call()
允许为标准输出指定文件对象,但在将数据写入文件之前,我希望逐行修改它们

我当前将输出重定向到一个临时文件(由
tempfile.TemporaryFile()
创建)。在
check\u call
完成后,我逐行读取该临时文件,进行修改并写入最终的输出文件

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

有人知道如何做到这一点吗

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
要使用它,请传递一个函数来修改每一行,下面的file.Dumb示例将以大写形式将
ls-l
的结果保存到
listupper.txt

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

Python是duck类型的,所以在将文件对象传递给
check\u call
之前,您可以始终包装它


这个答案有一个例子,但是,为了全面起见,您可能还需要包装
writelines()

-1:不,它不起作用,因为子流程需要一个带有
.fileno()的对象
方法,并直接写入该方法返回的文件描述符。事实上,文件描述符直接传递给子进程,因此python不参与写入。奇怪。我想我记得能够在没有
.fileno()
的情况下传入类似文件的对象。哦,我想是我的错误。