在我的 python 脚本中,我有这个:
count = 0
while 1:
print count
count += 1
我保存了这个文件并运行了它。
nohup python count.py >> test.log &
$tail -f test.log
当我尾随它时,什么也没有出现。
当您重定向 Python 输出时,stdout
流以缓冲模式(而不是行缓冲模式)打开。这意味着输出将保留在内存中,直到在刷新缓冲区之前打印了足够的行。
要立即查看行,您需要刷新输出流:
import sys
count = 0
while 1:
print count
sys.stdout.flush()
count += 1
或者,使用-u
命令行开关强制无缓冲 I/O:
nohup python -u count.py >> test.log &
或者您可以使用PYTHONUNBUFFERED
环境变量:
PYTHONUNBUFFERED=1 nohup python count.py >> test.log &
或以无缓冲模式重新打开stdout
文件句柄:
import os
import sys
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
在 Python 3.3 及更高版本中,这一切都更简单一些;您只需告诉print()
冲洗:
print(count, flush=True)
这是因为默认情况下对标准输出的写入进行缓冲。在缓冲区填满或文件描述符被刷新或关闭之前,您将什么也看不到。