2011-03-30 113 views
3

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

我目前输出重定向到一个临时文件(由tempfile.TemporaryFile()创建。check_call结束后,我读了临时文件中的行由行,做了修改和写入最终输出文件。

由于输出是大,一个纯粹的内存解决方案是不可行的,我想修改的即时数据和写入直接在最终输出文件。

有谁知道如何做到这一点?

回答

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

Python是鸭类型的,所以你可以随时将其传递给check_call之前包装你的文件对象。

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

+0

-1:不,它不起作用,因为子进程需要一个带'.fileno()'方法的对象,并直接写入由它返回的文件描述符。事实上,文件描述符直接传递给子进程,所以python不参与写入。 – nosklo 2011-03-30 21:45:12

+0

奇数。我以为我记得能够在没有'.fileno()'的情况下传递类似文件的对象。好吧。我猜,我的错误。 – ssokolow 2011-03-31 12:05:27

相关问题