Python 子进程读取

2 投票
2 回答
2910 浏览
提问于 2025-04-16 16:11

有这段代码

p = subprocess.Popen('tail -f /var/log/syslog', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

for line in p.stdout.readlines():
    print line,
    time.sleep(1)

这个脚本卡住了,甚至我就算往系统日志里加点东西,它也不写任何内容。

这是为什么呢?

2 个回答

2

你也可以直接在Python里模拟一下 tail -f 的功能。

看看这个链接: 在Python中实现tail -f(Python示例)

或者这个: 模拟"tail -f"命令,或者在谷歌上搜索更多的例子。

5

readlines() 这个函数会一直等到文件结束(eof)才会返回结果,但因为 tail 这个命令不会自己结束,所以它不会有文件结束的情况。

你可以把你的循环改成这样:

while True:
    print(p.stdout.readline())

除非你想在每行之间多等1秒,否则其实不需要加 sleep,因为 readline 会一直等着,直到有完整的一行数据可用,这样会用很少的资源。

撰写回答