如何将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中输入错误。

回答:

如果ddrescue将其stdout / stderr重定向到管道时仍不更改其输出,则可以使用tee实用程序在终端上显示输出并将其保存到文件中:

$ ddrescue input_path output_path ddrescue_logfile |& tee logfile

如果确实如此,那么您可以尝试使用script实用程序提供一个伪tty :

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

如果它直接写入终端,则可以screen用来捕获输出:

$ screen -L -- ddrescue input_path output_path ddrescue_logfile

screenlog.0默认情况下,输出保存在文件中。


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

#!/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()

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

#!/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基于命令:

#!/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()

screen在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()输出推送到终端和文件? 的全部内容, 来源链接: utcz.com/qa/427354.html

回到顶部