Pythonスクリプトの出力をファイルにリダイレクトする

Pythonスクリプトの出力をファイルにリダイレクトする

このPythonスクリプトの出力をログファイルに追加するにはどうすればよいですか?

sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2動作しません。エラーメッセージはなく、修正されていない空のログファイルのみがあります。

これにより、sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir期待どおりに出力がコンソールに移動します。

最終的には、 sudo inotifywait -mr --format '%e%w%f' --event move $srdir | python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2サービスとしてsystemdによってスクリプトで実行されますが、コマンドラインから手動で実行してもまだ記録されていないため、重要ではないと思います。

いずれの場合も、スクリプトは実際には正しく動作しますが、ログに出力を取得することはできません。

場合に備えてPythonスクリプト:

#!/usr/bin/python3
import sys
import time
from subprocess import call
src = ""
bkdir = sys.argv[1]
srdir = sys.argv[2]
while True:
        line = sys.stdin.readline()
        event, path = line.split("/",1)
        path="/"+path.rstrip();
        if event in  ["MOVED_FROM","MOVED_FROM,ISDIR"]:
                src = path.replace(srdir, bkdir, 1)
        if event in ["MOVED_TO","MOVED_TO,ISDIR"]:
                dst  =  path.replace(srdir, bkdir, 1)                    
                sys.stdout.write(time.strftime("%Y-%m-%d %H:%M:%S") + " mv " + src + " " + dst )
                call(["mv", src, dst])

編集:明らかにsudo inotifywait -mr --format '%e%w%f' --event move $srdir | sudo python3 /usr/bin/m-sync.py $bkdir $srdir >> /mnt/msync.py.log2コマンドラインで実行すると機能します。 Pythonを呼び出す前に、2番目のsudoをメモしてください。ただし、systemdで実行すると、すべてがデフォルトでルートであり、まだログに出力されません。

答え1

~からhttps://stackoverflow.com/a/3167526/7192818

これがPythonにも当てはまるかどうかはわかりませんが、実行しているOSによって異なると思います。

たとえば、Linuxから端末への出力は改行時にバッファをフラッシュしますが、ファイルへの出力の場合はバッファがいっぱいになったときにのみ(デフォルトで)フラッシュされます。これは、バッファをあまり頻繁にフラッシュする方が効率的で、ファイルの改行で出力がフラッシュされない場合にユーザーが気付く可能性が低いためです。

必要に応じて出力を自動的に更新することもできます。

したがって、Pythonスクリプトでsys.stdout.flush()書き込み後に追加すると、期待どおりに機能します。

まあ。

関連情報