交互式脚本中带有 tee 的实时打印语句

交互式脚本中带有 tee 的实时打印语句

long_interactive_script.py我有一个包含数千条语句的程序print。我想通过管道传输程序tee(或替代方案),以便我可以保存输出。

如果我做

long_interactive_script.py | tee logfile.txt

Python 将其打印语句放入 4K 缓冲区中,使我得到:

没什么,没什么,没什么,没什么,一大堆文字!,没什么,没什么,单词中间有一个 sudo 提示符,没什么,没什么,一大堆文字!

为了避免缓冲区,我尝试了:

unbuffer long_interactive_script.py | tee logfile.txt

但这会导致我的脚本停止交互。所以当脚本中断时须藤提示,它停止了。

注意:我无法sudo在运行脚本之前进行简单操作。交互式脚本仅sudo在某些运行时需要,并且我不想sudo在不需要时询问。

更多的...

stdbuf -oL long_interactive_script.py | tee -a logfile.txt

在一定程度上起作用。我获得了所有所需的数据,但也收到此错误:

ERROR: ld.so: object '/usr/lib64/coreutils/libstdbuf.so' from LD_PRELOAD cannot be preloaded: ignored.

答案1

为 Python 的标准输出流指定一个零大小的缓冲区。您可以通过使用该-u标志或以下语句调用 Python 来完成此操作。

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

答案2

尽管有缓冲的解决方法,但这就是其他人使用的原因script,它捕获写入终端的所有字符,而不会干扰交互式提示。

生成的typescript文件比仅仅重定向到标准输出要丑一些,但是(假设您的应用程序在该模式下提供有用的信息),只需修剪回车符就足够了。

除了回车符之外,还需要过滤掉编辑字符。参见示例:

相关内容