Python

通過 i3blocks 啟動 Python 腳本時沒有標準輸出

  • January 20, 2021

在 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)

我打算稍後用實際的 JSON-String 替換“test”,我只是將它剝離到這個版本以進行調試。

當我在命令行上執行此操作時,按預期每 5 秒test列印一次。stdout我可以通過以下方式獲取 PIDps 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在某個時候一次全部轉儲。

我能做些什麼呢?

謝穆魯的評論,我在這裡找到了答案:

如果我更改print("test")print("test", flush=True),輸出緩衝區會在列印後立即刷新,這解決了我的問題。

引用自:https://unix.stackexchange.com/questions/630006