您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:23:30 python 字数 2580 阅读 564 来源 www.jb51.cc/python

将 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中,如下所示:

#!/usr/bin/env python
from time import sleep

print "message1"
sleep(5)
print "message2"
sleep(5)
print "message3"

用./test_grep.py |调用时grep消息,10秒内不会出现任何内容,此时将显示所有三行.

将其与脚本test_grep.sh进行比较:

#!/usr/bin/env bash
echo "message1"
sleep 5 
echo "message2"
sleep 5
echo "message3"

./test_grep.sh | grep消息将立即输出message1,然后由message2和message3以5秒的间隔输出.

我希望这是因为只有python解释器完成执行后才能获得下一个命令的输出.有没有办法改变这种行为?

>通过刷新python中的每个打印件
>通过将stdout设置为无缓冲
>通过将stdout设置为行缓冲

你甚至可以调用python -u来禁用缓冲.

我会选择行缓冲选项,因为它看起来最自然.

open(file,mode='r',buffering=-1 ....)

buffering is an optional integer used to set the buffering policy.
Pass 0 to switch buffering off (only allowed in binary mode),1 to
select line buffering
(only usable in text mode),and an integer > 1
to indicate the size of a fixed-size chunk buffer.

当你没有指定缓冲(典型的“打开”)时,如果它检测到输出直接执行TTY,即屏幕控制台,它将使用行缓冲.如果管道输出或将其重定向文件,它将切换回大(4K / 8K)缓冲区.

How do you “set stdout to be line-buffered”?

您可以通过sys.stdout = os.fdopen(sys.stdout.fileno(),’w’,1)重新打开stdout.

总结

以上是编程之家为你收集整理的有没有办法从当前正在执行的python程序逐行输出管道?全部内容,希望文章能够帮你解决有没有办法从当前正在执行的python程序逐行输出管道?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶