gpt4 book ai didi

python - 如何将 subprocess.call() 输出推送到终端和文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:05 26 4
gpt4 key购买 nike

我有 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

如果it writes directly to a terminal然后你可以使用 screen 来捕获输出:

$ screen -L -- ddrescue input_path output_path ddrescue_logfile

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


要在 Python 中模拟基于 tee 的命令而不调用 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()

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

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

模拟基于脚本的命令:

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

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

关于python - 如何将 subprocess.call() 输出推送到终端和文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25963074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com