現在、bash ターミナルで次の 3 つのコマンドを実行します。
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
sh スクリプトに Python を入れても機能しません
添付ファイル:
1 test.php
<?php
$i = 1;
while (真) {
スリープ(1);
$i++ を出力します。 "\r\n";
if ($i > 10) {
壊す;
}
}
?>
2 test.py
#!/usr/bin/python
#coding=utf-8
インポート時間
i=1
True の場合:
私 += 1
私を印刷します
時間.睡眠(1)
私が 10 より大きい場合:
壊す
print "----------終了----------"
3 test.sh
#!/usr/bin/env bash
# cd /Users/cg/MyFiles/test && /usr/bin/python cgcg.py &
i=1
[[ 1 ]] を実行します。
睡眠1
i=`expr $i + 1`
エコー $i
終わり
phpcn_u15822017-05-16 13:10:29
気になるのですが、この場合、PHP はなぜブロック バッファリングを実行しないのでしょうか?
Python ターミナル以外のデバイスの標準出力をすぐに確認したい場合は、自分でフラッシュするか (print(..., flush=True)
或者 Python 2 里用 sys.stdout.flush
),要么使用 python -u
来运行脚本,要么你去把 sys.stdout
置き換えます。
通常、標準出力 (および標準エラーを除くその他のファイル) への出力はデフォルトでバッファリングされます。このチュートリアルを参照してください。これは、端末の場合はライン バッファリング、その他のデバイスの場合はブロック バッファリングです。標準エラーは通常、バッファリングされません。
ログを書き込んだり、行ベースの連続出力を実行したい場合は、対応するバッファリング モード (open
函数的 buffer 参数),或者在合适的地方调用 .flush()
メソッド。