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
文件比仅仅重定向到标准输出要丑一些,但是(假设您的应用程序在该模式下提供有用的信息),只需修剪回车符就足够了。
除了回车符之外,还需要过滤掉编辑字符。参见示例: