如何将 subprocess.call() 输出推送到终端和文件? [英] How do I push a subprocess.call() output to terminal and file?

查看:49
本文介绍了如何将 subprocess.call() 输出推送到终端和文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 subprocess.call(["ddrescue", in_file_path, out_file_path], stdout=drclog).我希望它在终端运行时显示 ddrescue 并将输出写入文件 drclog.我试过使用 subprocess.call(["ddrescue", in_file_path, out_file_path], stdout=drclog, shell=True),但这给了我一个 ddrescue 的输入错误.

I have subprocess.call(["ddrescue", in_file_path, out_file_path], stdout=drclog). I'd like this to display the ddrescue in the terminal as it's running and write the output to the file drclog. I've tried using subprocess.call(["ddrescue", in_file_path, out_file_path], stdout=drclog, shell=True), but that gives me an input error into ddrescue.

推荐答案

如果 ddrescue 在 stdout/stderr 被重定向到管道时没有改变它的输出,那么你可以使用 tee 实用程序,在终端上显示输出并将其保存到文件中:

If ddrescue doesn't change its output if its stdout/stderr are redirected to a pipe then you could use tee utility, to display output on the terminal and to save it to a file:

$ ddrescue input_path output_path ddrescue_logfile |& tee logfile

如果是这样,那么您可以尝试使用 script 实用程序提供伪 tty:

If it does then you could try to provide a pseudo-tty using script utility:

$ script -c 'ddrescue input_path output_path ddrescue_logfile' -q logfile

如果 它直接写入终端 那么您可以使用 screen 来捕获输出:

If it writes directly to a terminal then you could use screen to capture the output:

$ screen -L -- ddrescue input_path output_path ddrescue_logfile

输出默认保存在screenlog.0文件中.

The output is saved in screenlog.0 file by default.

在 Python 中模拟基于 tee 的命令而不调用 tee 实用程序:

To emulate the tee-based command in Python without calling tee utility:

#!/usr/bin/env python3
import shlex
import sys
from subprocess import Popen, PIPE, STDOUT

command = 'ddrescue input_path output_path ddrescue_logfile'
with Popen(shlex.split(command), stdout=PIPE, stderr=STDOUT, bufsize=1) as p:
    with open('logfile', 'wb') as logfile:
        for line in p.stdout:
            logfile.write(line)
            sys.stdout.buffer.write(line)
            sys.stdout.buffer.flush()

使用 shell=True 在 Python 中调用基于 tee 的命令:

To call the tee-based command in Python using shell=True:

#!/usr/bin/env python
from pipes import quote
from subprocess import call

files = input_path, output_path, ddrescue_logfile
rc = call('ddrescue {} |  tee -a drclog'.format(' '.join(map(quote, files))),
          shell=True)

要模拟基于 script 的命令:

To emulate the script-based command:

#!/usr/bin/env python3
import os
import shlex
import pty

logfile = open('logfile', 'wb')
def read(fd):
    data = os.read(fd, 1024) # doesn't block, it may return less
    logfile.write(data) # it can block but usually not for long
    return data
command = 'ddrescue input_path output_path ddrescue_logfile'
status = pty.spawn(shlex.split(command), read)
logfile.close()

在 Python 中调用 screen 命令:

To call screen command in Python:

#!/usr/bin/env python3
import os
import shlex
from subprocess import check_call

screen_cmd = 'screen -L -- ddrescue input_path output_path ddrescue_logfile'
check_call(shlex.split(screen_cmd))
os.replace('screenlog.0', 'logfile')

这篇关于如何将 subprocess.call() 输出推送到终端和文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆