强制刷新 Python-Bash-script 的一部分?

Force flush Python-part of Bash-script?

提问人:d-b 提问时间:11/3/2023 更新时间:11/3/2023 访问量:55

问:

我有一个简单的 Bash 脚本,它花费了超过 99% 的时间来执行 Python 应用程序(该脚本只是一个包装器,它在 for 循环中提供此 Python 脚本文件并重命名输出文件)。我有与此处描述的相同的问题,并且已经查看了答案,但不明白如何在我的上下文中使用它们。

我想我需要在我的脚本中,在执行 Python 脚本的行上应用该问题答案中的原则,但如何应用呢?

我的脚本是伪代码:

for file in "$directory"; do
    pythonscript "$file" >> "log.txt"; then
done

我想每分钟刷新pythonscript行,它产生的每一行输出或类似,这并不重要(通常执行需要几个小时,我只希望能够经常跟踪输出“合理”)。

python bash shell 缓冲区 刷新

评论

0赞 Christoph 11/3/2023
转储问题,为什么不将整个逻辑移动到 Python 脚本本身中,例如获取所有文件并迭代,例如调用您的函数,然后将日志记录添加到 Python 脚本中,这样您就不需要混合 Python 和 bash
0赞 d-b 11/3/2023
@Christoph 没有考虑过这一点,如果我编写了 Python 应用程序,这是有道理的,但它是外部的并且会定期更新,这意味着每次更新时我都必须应用修改。
0赞 Ed Morton 11/4/2023
您链接的问题得票最高的答案是,给定一个要无缓冲运行的脚本,您应该调用 as 代替。你的脚本是这样称呼它的。有关更多信息,请参见 gnu.org/software/coreutils/manual/html_node/.../homedir/MyScriptstdbuf -oL /homedir/MyScriptpythonscript "$file"stdbuf -oL pythonscript "$file"stdbuf
0赞 Ed Morton 11/4/2023
顺便说一句,考虑使用 instead 而不是 so 你只打开一次输出文件,充其量是令人困惑的术语,或者只是一个错误,这取决于它的目的是什么。for file in "$directory"; do whatever; done >log.txtfor file in "$directory"; do whatever >> log.txt; donefor file in "$directory"
0赞 d-b 11/4/2023
@EdMorton我在 Mac 上,似乎没有(尽管从 MacPorts 安装)。stdbufGNU core utils

答:

1赞 Diego Torres Milano 11/3/2023 #1

你可以使用 env varPYTHONUNBUFFERED

export PYTHONUNBUFFERED=true
for file in "$directory"; do
    pythonscript "$file" >> "log.txt"; then
done