gpt4 book ai didi

python - 有什么方法可以从当前正在执行的 python 程序中逐行输出管道?

转载 作者:太空狗 更新时间:2023-10-29 22:27:10 24 4
gpt4 key购买 nike

当将 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 秒输出 message2message3

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

最佳答案

你可以做到:

  • 通过在 python 中刷新每个 print
  • 通过将标准输出设置为无缓冲
  • 通过将标准输出设置为行缓冲

您甚至可以调用 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 程序中逐行输出管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com