将来自python脚本的打印输出通过管道传输到grep之类的命令时,脚本的输出似乎只在整个脚本完成后才通过管道传输到后续命令。
例如,在如下所示的脚本test_grep.py中:
#!/usr/bin/env python
from time import sleep
print "message1"
sleep(5)
print "message2"
sleep(5)
print "message3"当使用./test_grep.py | grep message调用时,10秒内什么都不会出现,此时所有三行都会出现。
将其与脚本test_grep.sh进行比较
#!/usr/bin/env bash
echo "message1"
sleep 5
echo "message2"
sleep 5
echo "message3"./test_grep.sh | grep message将立即输出message1,每隔5秒输出一次message2和message3。
我认为这是因为只有在python解释器完成执行后,输出才可用于下一个命令。有什么方法可以改变这种行为吗?
发布于 2013-02-26 17:19:24
你可以做到:
open(file, mode='r', buffering=-1 ....)buffering是一个可选整数,用于设置缓冲策略。传递0以关闭缓冲(仅允许在二进制模式下),传递1以选择行缓冲(仅在文本模式下可用),传递大于1的整数以指示固定大小的块缓冲区的大小。
当你没有指定buffering (典型的"open")时,如果它检测到输出将直接执行TTY,即发送到屏幕控制台,则将使用行缓冲。如果您通过管道输出或将其重定向到一个文件,它将切换回一个大的(4K / 8K)缓冲区。
如何“将标准输出设置为行缓冲”?
您可以通过sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1)重新打开stdout。
https://stackoverflow.com/questions/15085237
复制相似问题