Python
通過 i3blocks 啟動 Python 腳本時沒有標準輸出
在 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)
,輸出緩衝區會在列印後立即刷新,這解決了我的問題。