restic如何将数据输出到屏幕而不输出到stdout或stderr?

问题描述 投票:0回答:1

我有一个关于某个命令的输出去向的问题。我使用

restic
作为具有这种行为方式的命令的示例。这是我感兴趣的命令的最后一行,因为它会在恢复过程运行时更新。

就上下文而言,restic 是一个备份实用程序;下面的命令是将

my-repo
上存储的备份中的内容恢复到我的本地计算机。
example.com

最后一行会随着时间更新,直到达到 100%,例如

$ restic restore latest --repo sftp:[email protected]:my-repo --target . --verbose repository ae412afe opened (version 1) restoring <Snapshot dff2f51a> to /Users/matt [0:11] 0.02% 192 files 37.687 MiB, total 39644 files 171.389 GiB

我想从 Python 脚本运行恢复命令(使用 
[12:31] 1.22% 2989 files 2.087 GiB, total 39644 files 171.389 GiB

)并希望脚本打印出更新行,但无法使其正常工作。

我怀疑更新行可能被输出到 stderr 而不是 stdout。所以我重复了恢复命令并将stdout和stderr重定向到文件,如下所示:

subprocess.Popen

restic restore lat...rbose > out.log 2> err.log

保持为空,并且

err.log
仅包含
out.log
行,没有其他内容。

我有几个问题。

为什么我的两个输出文件中都没有
    restoring <Snapshot dff2f51a> to /Users/matt
  • 行?
  • repository ae412afe opened (version 1)
  • 线去哪里?我该如何展示它?
    
        
python subprocess stdout stderr flush
1个回答
0
投票
Popen 文档

stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为 PIPE、DEVNULL、现有文件描述符(正整数)、具有有效文件描述符的现有文件对象和 None。 PIPE 指示应创建一个通往子级的新管道。 DEVNULL 表示将使用特殊文件 os.devnull。默认设置为None,则不会发生重定向;子级的文件句柄将从父级继承。此外,stderr 可以是 STDOUT,这表示来自应用程序的 stderr 数据应捕获到与 stdout 相同的文件句柄中。

这意味着,如果您在
[0:11] 0.02% 192 fil...

构造函数中使用

stdin=None
stderr=None
,子进程将从 Python 继承
Popen
STDIN
文件描述符。换句话说,程序发送到这些流的任何输出都将显示为 Python 自己的标准输出/标准错误。
    

© www.soinside.com 2019 - 2024. All rights reserved.