linux tee不能与python一起使用?


102

我制作了一个python脚本,该脚本使用无限循环与Web服务器通信。我想将每个通讯数据记录到一个文件中,并同时从终端监视它们。所以我像这样使用tee命令。

python client.py | tee logfile

但是,我没有从终端或日志文件中得到任何东西。python脚本运行正常。这是怎么回事 我错过了什么吗?

一些建议,将不胜感激。先感谢您。


3
管道和终端的缓冲行为不同。sys.stdout.flush()每当您记录一行时,您可能都需要对脚本进行显式处理。
卢卡斯·格拉夫

有关触发无缓冲输出的其他方法,请参见stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Answers:


178

来自man python

   -u     Force stdin, stdout and stderr to  be  totally  unbuffered.   On  systems
          where it matters, also put stdin, stdout and stderr in binary mode.  Note
          that there is internal buffering in xreadlines(), readlines()  and  file-
          object  iterators  ("for  line  in sys.stdin") which is not influenced by
          this option.  To work around this, you will want to use  "sys.stdin.read‐
          line()" inside a "while 1:" loop.

因此,您可以做的是:

/usr/bin/python -u client.py >> logfile 2>&1

或使用tee

python -u client.py | tee logfile

1
一种替代方法是使用script,它还会禁用缓冲并另外使控制序列(C-a,光标键等)起作用:stackoverflow.com/a/39269661/15690
2016年

优秀的!在配备Raspbian Jessie的Raspberry Pi 3上,它在Python 3中也起作用:python3 -u client.py | 发球台日志文件
Antonino

注意:如果stdin和stdout是控制台,则python像其他命令一样将使用行缓冲,但是如果将结果重定向到文件或管道,则将使用全缓冲。tee看起来像是管道(它是管道),而不是混合管道:它写入控制台。注意:该行为也可以在python程序中控制。
Giacomo Catenazzi

另一个注意事项:python -u client.py | tee >> logfile无效。这>>将引入缓冲写入文件的另一种情况。那就是tee -a解决的方法。
tanius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.