目前在bash终端依次执行如下三条命令:
1:php test.php >> test.log
2:python test.py >> test.log
3:sh test.sh >> test.log
并且在另一个窗口执行:tail -f test.log
其中1 php和3 bash可以实时在test.log中写入,
但是为什么python只会在python程序结束之后才会在test.log中写入?
并且像这样:
echo "cd $test_dir && /usr/bin/python test.py &" >> test_py.sh && sh test_py.sh
将python放入sh脚本中执行也不行
附:
1 test.php
<?php
$i = 1;
while (True) {
sleep(1);
print $i++ . "\r\n";
if ($i > 10) {
break;
}
}
?>
2 test.py
#!/usr/bin/python
# coding=utf-8
import time
i = 1
while True:
i += 1
print i
time.sleep(1)
if i > 10:
break
print "----------end-----------"
3 test.sh
#!/usr/bin/env bash
# cd /Users/cg/MyFiles/test && /usr/bin/python cgcg.py &
i=1
while [[ 1 ]]; do
sleep 1
i=`expr $i + 1`
echo $i
done
我反倒是好奇,为什么 PHP 不会在此种情况下进行块缓冲?
Python 你想立即看到对于终端之外的设备的标准输出的话,要么你自己 flush 一下(
print(..., flush=True)
或者 Python 2 里用sys.stdout.flush
),要么使用python -u
来运行脚本,要么你去把sys.stdout
替换掉。通常,对标准输出(以及其它除标准错误之外的文件)的输出,默认是带缓冲的,你可以看一下这个教程。对于终端是行缓冲,对于其它设备是块缓冲。标准错误一般是无缓冲的。
如果要写日志,或者做基于行的持续性输出的话,记得设置相应的缓冲模式(
open
函数的 buffer 参数),或者在合适的地方调用.flush()
方法。