i3blocksを介して実行すると、Pythonスクリプトにstdoutはありません。

i3blocksを介して実行すると、Pythonスクリプトにstdoutはありません。

i3blocks では、次のブロックを定義します。

~/.config/i3blocks/config:

[test]
interval=persist
format=json

対応する実行可能スクリプト ~/.config/i3blocks/config.scripts/test:

#!/usr/bin/python

from time import sleep

while True:
     print("test")
     sleep(5)

後で、「test」を実際のJSON文字列に置き換える予定です。デバッグ目的でこのバージョンでのみ削除します。

コマンドラインからこのコマンドを実行すると、test予想どおり5秒ごとに印刷されます。 PIDを取得して次stdoutのようにps aux確認できますstrace

$ sudo strace -p82267 -s9999 -e write
strace: Process 82267 attached
write(1, "test\n", 5)                   = 5
write(1, "test\n", 5)                   = 5
[...]

ps auxまた、i3blocks が起動した他のプロセスも示しています。straceこのプロセスは私に何の結果も与えず、その理由を理解していません。ループが実行されているようですが実行されませんstdout。これを確認するためにループを削除してi3blocksを再起動しましたが、プロセスはリストされなくなりました。

プロセスの起動時にi3blocksが表示されないのはstdoutなぜですか?

編集する:

長い間実行した後、次の事実が見つかりました。一群のテキストが一度にダンプさstraceれることを示しました。stdout

$ sudo strace -p79878 -s9999 -e write
strace: Process 79878 attached
--- SIGSTOP {si_signo=SIGSTOP, si_code=SI_USER, si_pid=79873, si_uid=1000} ---
--- stopped by SIGSTOP ---
--- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=79873, si_uid=1000} 
write(1, "test\ntest\n[...a big big block of output here...]test\ntest", 8194) = 8194

SIGSTOPとSIGCONTも数回発生しました。

したがって、出力は長い間、stdoutいくつかのバッファに保存されていたが、ある時点ですべてのバッファに同時にダンプされるように見えます。

この問題についてどうすればよいですか?

ベストアンサー1

ありがとうムルさんのコメントに答えを見つけました。ここ:

print("test")に変更すると、print("test", flush=True)印刷直後に出力バッファがフラッシュされ、問題が解決されました。

おすすめ記事