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

How is restic outputting data to the screen but not to stdout or stderr?

提问人:Matt 提问时间:8/28/2023 最后编辑:Matt 更新时间:9/11/2023 访问量:86

问:

更新行

我有一个关于某个命令的输出去哪里的问题。我使用这种行为的命令作为示例。这是我感兴趣的命令的最后一行,因为它会在还原过程工作时更新。restic

对于上下文,restic 是一个备份实用程序;以下命令正在将 从备份中存储的内容还原到我的本地计算机。my-repoexample.com

$ 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

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

[12:31] 1.22%  2989 files 2.087 GiB, total 39644 files 171.389 GiB

从 python 执行

我想从 Python 脚本(使用 )运行 restore 命令,并希望脚本打印出更新行,但无法正常工作。subprocess.Popen

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

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

err.log保持为空,仅包含该行,不包含其他任何内容。out.logrestoring <Snapshot dff2f51a> to /Users/matt


Python 代码段

这是我调用 Popen 的代码片段:

backup_command = [
    # fmt: off
    "restic",
    "--repo", repo_name,
    "backup",
    "--verbose",
    "--exclude", "node_modules",
    "--exclude", "whatever",
    # fmt: on
]
backup_process = subprocess.Popen(backup_command, env=env_vars)
backup_process.wait()

关于下面 jurez 的回答,我没有通过或,但在查看了 Popen 的来源后,根据 jurez 的建议,它们默认为 。stdinstderrNone


问题

我有几个问题。

  • 为什么我的两个输出文件中都没有该行?repository ae412afe opened (version 1)
  • 这条线要去哪里?我该如何展示它?[0:11] 0.02% 192 fil...
python 子进程 stdout stderr 刷新

评论

2赞 jasonharper 9/1/2023
来自文档:“从非交互式控制台运行时,默认情况下禁用进度报告,以不填充日志。显然,您可以通过提供环境变量来覆盖它。resticRESTIC_PROGRESS_FPS
0赞 Matt 9/2/2023
谢谢@jasonharper,做到了!下次🤦 ♂️我会自己阅读文档,你能把它作为答案发布,以便我可以接受吗?

答:

0赞 jurez 8/28/2023 #1

Popen 文档

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

这意味着,如果您在构造函数中使用 and,子进程将从 Python 继承 and 文件描述符。换句话说,程序将发送到这些流的任何输出都将显示为 Python 自己的标准输出/标准错误。stdin=Nonestderr=NonePopenSTDINSTDERR

评论

0赞 Matt 9/1/2023
感谢您的建议,但恐怕没有帮助。我应该发布我的 python 应用程序的片段,我已经在使用stidin=Nonestderr=None
0赞 Matt 9/8/2023 #2

来自 restic 文档

从非交互式控制台运行时,默认情况下会禁用进度报告,以便不填充日志。对于交互式和非交互式控制台,环境变量可用于控制进度报告的频率。例如,使用 0.016666 每分钟仅更新一次进度。RESTIC_PROGRESS_FPS

我使用 创建了一个非交互式 shell,导致没有进度报告输出。设置该值的工作方式与播发的方式相同。我发现更容易将“每次更新之间的秒数”视为“每秒帧数”,因此用于设置 FPS。Popen1 / INTERVAL_IN_SECONDS

感谢 jasonharper 查找文档,谢谢!