当前位置: 首页 > 面试题库 >

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

司寇星海
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 如何将彩色字符打印到支持它的Linux终端? 如何判断终端是否支持颜色代码? 问题答案: 您需要输出ANSI颜色代码。请注意,并非所有终端都支持此功能。如果不支持颜色序列,则会显示垃圾。 例: 此处是ESC字符ASCII27。其后是,然后是零个或多个数字,以分隔,最后是字母。数字描述从该点开始要切换到的颜色和格式。 前景色和背景色的代码为: 此外,您可以使用以下这些: 请参阅Wikip

  • 问题内容: 如何通过管道将os.Exec的stdout发送到文件,同时也发送到终端? 我已经试过了: 但是文件丢失了。如何让他们回来?也许管道有一些更优雅的解决方案? 问题答案: 使用参数os.Stdout和文件创建io.MultiWriter。将Cmd.Stdout设置为multiwriter。运行命令。 如果要逐行写入log.Debugf和其他文件,请执行以下操作: 此代码假定输入中的行分隔符

  • 问题内容: 在我的机器上,我有一些软件可以在终端中接收命令并返回值列表。 要运行它,我必须输入以下内容: 我正在尝试将其作为python程序的一部分运行。当我运行以下命令时: 然后我得到想要返回到终端的值(其中epoch_name是文件名的变量名)。但是,当我尝试将结果写入文件时: 产生了文件123.txt,但它为空。 我知道我放错了“和/或’字符,但是我不知道它们应该去哪里。 任何帮助将不胜感激

  • 问题内容: 我试图将命令输出也扔到文件加上控制台。这是因为我要在文件中保留输出记录。我正在执行以下操作,并将其追加到文件,但不在终端上打印输出。 问题答案: 是的,如果您重定向输出,它将不会出现在控制台上。使用。

  • 问题内容: 我正在从另一个python脚本(A)调用python脚本(B)。 使用subprocess.call,如何将B的标准输出重定向到指定的文件? 我正在使用python 2.6.1。 问题答案: 将文件作为参数传递给:

  • 问题内容: 在bash中,调用将在stdout上显示该命令的任何输出。 调用会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。 有没有一种方法可以将输出重定向到文件 并 在stdout上显示? 问题答案: 您想要的命令名为 : 例如,如果您只关心标准输出: 如果要包括stderr,请执行以下操作: 将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两