通过 i3blocks 启动时,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 字符串替换“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在某个时刻一次性转储到所有缓冲区。

对此我能做什么?

答案1

谢谢穆鲁s评论,我找到了答案这里:

如果我更改print("test")print("test", flush=True),输出缓冲区会在打印后立即刷新,这解决了我的问题。

相关内容