首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法从当前正在执行的python程序中逐行输出?

有没有办法从当前正在执行的python程序中逐行输出?
EN

Stack Overflow用户
提问于 2013-02-26 17:15:46
回答 1查看 229关注 0票数 6

将来自python脚本的打印输出通过管道传输到grep之类的命令时,脚本的输出似乎只在整个脚本完成后才通过管道传输到后续命令。

例如,在如下所示的脚本test_grep.py中:

代码语言:javascript
复制
#!/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进行比较

代码语言:javascript
复制
#!/usr/bin/env bash
echo "message1"
sleep 5 
echo "message2"
sleep 5
echo "message3"

./test_grep.sh | grep message将立即输出message1,每隔5秒输出一次message2message3

我认为这是因为只有在python解释器完成执行后,输出才可用于下一个命令。有什么方法可以改变这种行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-26 17:19:24

你可以做到:

  • 通过刷新python
  • 中的每个行通过将stdout设置为无缓冲
  • 通过将stdout设置为行缓冲

代码语言:javascript
复制
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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15085237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档